1 Brief explanation

Every boxplot means a monitoring point (Ponto de monitoramento (or PM) in portuguese). My goal here is to analyze the evolution between decades of each water quality parameter that compounds the Water Quality Index (WQI).

The river flows in the east-west direction as shown in the image below.

The logic behind the sorting in the boxplots is because of 2 main reasons:

  1. The original monitoring point isn’t easy to understand (8 digits, like 87409900)
  2. Changing the original nomenclature to PM1, PM2 (…) makes it easier to understand that the last point has water contributions of every other point upstream.

Some features that I want to add: * If the parameter is x, then use x’s classes (with its own classes background color plotted) * Define the timescale, should act just like a filter

# plan_wide_19902020 %>%
#   filter(ANO_COLETA > "1990" &
#          ANO_COLETA <= "2000")

2 Anotações de coisas por fazer:

  • Descobrir como colocar as estações no sentido correto montante -> jusante nos sumários

87398500, 87398980, 87398900, 87398950, 87405500, 87406900, 87409900

  • Aprender a segmentar o meu dataset por períodos
  • aprender a criar uma nova coluna com a segmentação dos períodos
  • maybe use ~facet.grid
  • aprender a colocar a legenda dentro do gráfico
    • reduzir o tamanho da legenda
  • corrigir os valores 0 de IQA pra NA
  • descobrir como conseguir a equação do lm
  • aprender a pivotar o sumário -> meu sumário do google docs ta batendo direitinho com o do R
  • descobrir se há outros TCCs com disponibilização de códigos
  • Namon tá com com casa decimal "," e ptot tá com "."
  • correlação forte entre condutividade e Namon/Ptot/DBO
1990-2000 2000-2010 2010-2020
1990-2000 2000-2010 2010-2020

3 Instalar os pacotes

# install.packages(tidyverse)

3.1 acessar os pacotes

# library(readr)
# library(rmarkdown)
# # library(qboxplot)
# library(readxl)
# library(pillar)
# library(dplyr)
# library(tidyverse)
# library(gapminder)
# library(knitr)
# library(kableExtra)
# library(ggpubr)
# library(gridExtra)
# library(modelsummary)
# library(gtsummary)
# library(GGally)
pacman::p_load(readr, rmarkdown, readxl,
               pillar, dplyr, tidyverse,
               gapminder, knitr, kableExtra,
               gridExtra, #modelsummary, 
               gtsummary, ggplot2,
               ggbeeswarm, GGally)
# pacman::p_load(tibbletime)
knitr::knit_hooks$set(time_it = local({
  now <- NULL
  function(before, options) {
    if (before) {
      # record the current time before each chunk
      now <<- Sys.time()
    } else {
      # calculate the time difference after a chunk
      res <- difftime(Sys.time(), now)
      # return a character string to show the time
      paste("Time for this code chunk to run:", res)
    }
  }
}))

knitr::opts_chunk$set(time_it = TRUE)

3.2 importando a planilha

Time for this code chunk to run: 0.433434009552002

Time for this code chunk to run: 0.233090877532959

4 data wrangling

plan_wide_19902020 <- plan_wide_19902020 %>% 
  mutate(IQA = ifelse(IQA == 0, NA, IQA))

Time for this code chunk to run: 0.0150489807128906

Time for this code chunk to run: 0.00200390815734863

Time for this code chunk to run: 0.00301218032836914

5 setting theme

theme_grafs <- function(bg = "white", 
                        coloracao_letra = "black") {
  theme(
    plot.title = element_text(
      hjust = 0.5,
      color = coloracao_letra,
      size = 19),
    
    axis.title.x = 
      # element_text(
      # color = coloracao_letra,
      # size = 15,
      # angle = 0,),
      element_blank(),
    axis.title.y = element_text(
      color = coloracao_letra,
      size = 15,
      angle = 90),
    
    axis.text.x = element_text(
      color = coloracao_letra,
      size = 17),
    axis.text.y = element_text(
      color = coloracao_letra,
      size = 17,
      angle = 0),
    
    panel.background = element_rect(fill = bg),
    plot.background = element_rect(fill = bg),
    plot.margin = margin(l = 5, r = 10,
                         b = 5, t = 5)
  )
}

Time for this code chunk to run: 0.0040130615234375

6 setting different timescales

Time for this code chunk to run: 0.00200510025024414

7 setting sumaries

Time for this code chunk to run: 0.00501513481140137

8 Parâmetros físico-químicos

8.0.1 Oxigênio Dissolvido

# par_od <- plan_wide_19902020 %>%
#   select(CODIGO, `Oxigênio dissolvido`) %>%
#   group_nest(CODIGO)

# data %>%  o que o Pat fez no CC156 21min56s
#   highlight_key(., ~) %>% 
#   ggplot()
# oxig_p1 <- p1 %>% 
#   select(CODIGO, `Oxigênio dissolvido`)
# 
# par_od <- plan_wide_19902020 %>% 
#   select(CODIGO, ) %>% 
#   group_by(CODIGO)

# parametros_IQA

# parametros <- colnames(parametros_IQA)

# base_od <- function(titulo = "Título") {
#   annotate("rect",
#            xmin = -Inf, xmax = Inf,
#            ymin = -Inf, ymax = 2,
#            alpha = 1,
#            fill = "#ac5079")+ # >pior classe
#     annotate("rect",
#              xmin = -Inf, xmax = Inf,
#              ymin = 2, ymax = 4,
#              alpha = 1,
#              fill = "#eb5661")+ #classe 4
#     annotate("rect",
#              xmin = -Inf, xmax = Inf,
#              ymin = 4, ymax = 5,
#              alpha=1,
#              fill="#fcf7ab")+ #classe 3
#     annotate("rect",
#              xmin=-Inf,
#              xmax=Inf,
#              ymin=5,
#              ymax=6,
#              alpha=1,
#              fill="#70c18c")+ #classe 2
#     annotate("rect",
#              xmin=-Inf,
#              xmax=Inf,
#              ymin=6,
#              ymax=Inf,
#              alpha=1,
#              fill="#8dcdeb")+ #classe 1
#     stat_boxplot(
#       geom = 'errorbar',
#       width=0.3,
#       position = position_dodge(width = 0.65)
#     )+
#     labs(
#       title = titulo,
#       x = "Estação",
#       y = "mg/L"
#     )+
#     geom_quasirandom(
#       size = 1.2,
#       alpha = .25,
#       width = .07,
#     )+
#     scale_y_continuous(
#       expand = expansion(mult = c(0,0)),
#       n.breaks = 11,
#       limits = c(-1,21)
#     )+
#     scale_x_discrete(limits = c("87398500",
#                                 "87398980",
#                                 "87398900",
#                                 "87398950",
#                                 "87405500",
#                                 "87406900",
#                                 "87409900"),
#                      labels = c("PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7")
#     )+
#     geom_smooth(method = "lm",
#                 se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
#                 aes(group=1),
#                 alpha=.5,
#                 na.rm = TRUE,
#                 size = 1)
# }

# plan_wide_19902020 %>%
#   ggplot(
#     aes(CODIGO, `Oxigênio dissolvido`)
#   )+
#   geom_boxplot(
#       fill = '#F8F8FF',
#       color = "black",
#       outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
#       width= 0.7
#     )+
#   base_od("Oxigênio 1990")

Time for this code chunk to run: 0.00901389122009277

Oxigênio Dissolvido no período 1990-2000Time for this code chunk to run: 0.912316083908081

Time for this code chunk to run: 0.640455961227417

Time for this code chunk to run: 0.572896957397461

grid.arrange(od_p1, od_p2, od_p3, ncol = 3)

Oxigênio Dissolvido no período 1990-2020Time for this code chunk to run: 1.66326308250427

ggsave("od_p1.png",
       plot = od_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 7 rows containing non-finite values (stat_boxplot).
## Removed 7 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 7 rows containing missing values (position_quasirandom).
ggsave("od_p2.png",
       plot = od_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 54 rows containing non-finite values (stat_boxplot).
## Removed 54 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 54 rows containing missing values (position_quasirandom).
ggsave("od_p3.png",
       plot = od_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 31 rows containing non-finite values (stat_boxplot).
## Removed 31 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 31 rows containing missing values (position_quasirandom).
ggsave("od_3periodos_2.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(od_p1, od_p2, od_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Removed 7 rows containing non-finite values (stat_boxplot).
## Warning: Removed 7 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 7 rows containing missing values (position_quasirandom).
## Warning: Removed 54 rows containing non-finite values (stat_boxplot).
## Removed 54 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 54 rows containing missing values (position_quasirandom).
## Warning: Removed 31 rows containing non-finite values (stat_boxplot).
## Removed 31 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 31 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.66787910461426

Time for this code chunk to run: 0.00601887702941895

Time for this code chunk to run: 0.615384101867676

Time for this code chunk to run: 0.624423027038574

Time for this code chunk to run: 0.555840969085693

grid.arrange(iqaod_p1, iqaod_p2, iqaod_p3, ncol = 3)

Time for this code chunk to run: 1.71024799346924

## # A tibble: 7 x 8
##   par    `87398500` `87398900` `87398950` `87398980` `87405500` 874069~1 87409~2
##   <chr>       <dbl>      <dbl>      <dbl>      <dbl>      <dbl>    <dbl>   <dbl>
## 1 min          0.8        2          2.5        4.2        0.1      0.1     0.1 
## 2 q1           4.9        5.6        4.4        6          1.9      0.25    1.4 
## 3 median       6.4        6.9        5.95       6.3        4.2      2.6     2.9 
## 4 mean         5.99       6.78       5.98       7.01       4.22     2.98    3.60
## 5 q3           7.3        8          7.1        8.2        6        5       5.65
## 6 max         10.8       10.5       10.3       12.1       19.9     10.2    11.1 
## 7 n          101        101         68         30         97       32      65   
## # ... with abbreviated variable names 1: `87406900`, 2: `87409900`
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   0.4   3.5   4.9   5.01  6.65  10.9
## 2 87398900   1.9   4     5.5   5.33  6.6   12  
## 3 87398950   1.7   3.2   5.3   5.06  6.18   8.9
## 4 87398980   1.2   3.8   5.6   5.38  6.6    9.2
## 5 87405500   0.2   1.4   2.55  3.28  4     14.2
## 6 87406900   0     1.1   1.9   2.59  3.15  16  
## 7 87409900   0     0.7   2.3   3.12  3.7   10.6
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  0.38 3.11    4.41  4.57  6.2   12.4
## 2 87398900  3.52 5.25    5.96  6.61  7.3   13.8
## 3 87398950  1.62 3.68    4.92  5.28  6.64  11.9
## 4 87398980  3.37 5.5     6.17  6.48  7.14  13.1
## 5 87405500  0.2  1.3     2.53  2.83  3.66   9.8
## 6 87406900  0.1  0.865   2.4   2.43  3.05   9.1
## 7 87409900  0.1  0.92    2.03  2.43  3.5    8.1

Time for this code chunk to run: 0.26688289642334

8.0.2 Demanda Bioquímica de Oxigênio

Time for this code chunk to run: 0.597320079803467

Time for this code chunk to run: 0.610345125198364

Time for this code chunk to run: 0.772555112838745

Time for this code chunk to run: 0.601273059844971

Time for this code chunk to run: 0.545130968093872

Time for this code chunk to run: 0.532762050628662

grid.arrange(dbo_p1, dbo_p2, dbo_p3, ncol = 3)

Time for this code chunk to run: 1.54075312614441

(sum_dbo_p1 <- plan_wide_19902020 %>%
   select(CODIGO, DBO, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(DBO, 
           na.rm = TRUE),
     q1 = 
       quantile(DBO, 0.25, 
                na.rm = TRUE),
     median = 
       median(DBO, 
              na.rm = TRUE),
     mean = 
       mean(DBO, 
            na.rm= TRUE),
     q3 = 
       quantile(DBO, 0.75, 
                na.rm = TRUE),
     max = 
       max(DBO, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1      2  1.86   2      13
## 2 87398900     1     1      1  1.52   2       6
## 3 87398950     1     1      1  1.66   2       6
## 4 87398980     1     1      1  1.13   1       2
## 5 87405500     1     2      3  5.37   5      64
## 6 87406900     1     4      5  9     11      26
## 7 87409900     2     3      4  6.97   9.5    31
(sum_dbo_p2 <- plan_wide_19902020 %>%
    select(CODIGO, DBO, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(DBO, 
            na.rm = TRUE),
      q1 = 
        quantile(DBO, 0.25, 
                 na.rm = TRUE),
      median = 
        median(DBO, 
               na.rm = TRUE),
      mean = 
        mean(DBO, 
             na.rm= TRUE),
      q3 = 
        quantile(DBO, 0.75, 
                 na.rm = TRUE),
      max = 
        max(DBO, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1      1  1.58   2       5
## 2 87398900     1     1      1  1.40   2       5
## 3 87398950     1     1      1  1.66   2       5
## 4 87398980     1     1      1  1.30   1       5
## 5 87405500     1     2      4  4.67   6.5    14
## 6 87406900     1     3      5  6.53   8      28
## 7 87409900     1     3      6  6.31   9      15
(sum_dbo_p3 <- plan_wide_19902020 %>%
    select(CODIGO, DBO, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(DBO, 
            na.rm = TRUE),
      q1 = 
        quantile(DBO, 0.25, 
                 na.rm = TRUE),
      median = 
        median(DBO, 
               na.rm = TRUE),
      mean = 
        mean(DBO, 
             na.rm= TRUE),
      q3 = 
        quantile(DBO, 0.75, 
                 na.rm = TRUE),
      max = 
        max(DBO, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     1     1    1.5  2.15  3        7
## 2 87398900     1     1    1    1.51  2        5
## 3 87398950     1     1    2    2.65  2       18
## 4 87398980     1     1    1    1.32  2        2
## 5 87405500     1     3    4    5.28  6.25    21
## 6 87406900     1     3    5    6.58 10       24
## 7 87409900     1     3    4.5  6.18  8       18

Time for this code chunk to run: 0.183608055114746

ggsave("dbo_p1.png",
       plot = dbo_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 22 rows containing non-finite values (stat_boxplot).
## Removed 22 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 22 rows containing missing values (position_quasirandom).
ggsave("dbo_p2.png",
       plot = dbo_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 30 rows containing non-finite values (stat_boxplot).
## Removed 30 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 30 rows containing missing values (position_quasirandom).
ggsave("dbo_p3.png",
       plot = dbo_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 8 rows containing non-finite values (stat_boxplot).
## Removed 8 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 8 rows containing missing values (position_quasirandom).
ggsave("dbo_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(dbo_p1, dbo_p2, dbo_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 22 rows containing non-finite values (stat_boxplot).
## Removed 22 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 22 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 30 rows containing non-finite values (stat_boxplot).
## Removed 30 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 30 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 8 rows containing non-finite values (stat_boxplot).
## Removed 8 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 8 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.27341485023499

8.0.3 Fósforo total

(ptot_p1<-ggplot(plan_wide_19902020%>% 
                   filter(ANO_COLETA>"1990" &
                            ANO_COLETA<="2000"),
                 aes(CODIGO,
                     `Fósforo total`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.15,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.1,
            ymax=0.15,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=0.1,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Fósforo total no período 1990-2000",
        x="Estação",
        y="mg/L")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$`Fósforo total`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Fósforo total`), na.rm = TRUE),
                      trans = "log10")+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
 theme_grafs()
)

Time for this code chunk to run: 0.59525990486145

(ptot_p2 <- ggplot(plan_wide_19902020%>% 
                     filter(ANO_COLETA>"2000" &
                              ANO_COLETA<="2010"),
                   aes(CODIGO,
                       `Fósforo total`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.15,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.1,
            ymax=0.15,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=0.1,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Fósforo total no período 2000-2010",
        x="Estação",
        y="mg/L")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$`Fósforo total`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Fósforo total`), na.rm = TRUE),
                      trans = "log10")+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
 theme_grafs()
)

Time for this code chunk to run: 0.551826000213623

(ptot_p3 <- ggplot(plan_wide_19902020%>% 
                     filter(ANO_COLETA>"2010" &
                              ANO_COLETA<="2020"),
                   aes(CODIGO,
                       `Fósforo total`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.15,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0.1,
            ymax=0.15,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=0.1,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Fósforo total no período 2010-2020",
        x="Estação",
        y="mg/L")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.03,0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$`Fósforo total`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Fósforo total`), na.rm = TRUE),
                      trans = "log10")+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.537577867507935

grid.arrange(ptot_p1, ptot_p2, ptot_p3, ncol = 3)

Time for this code chunk to run: 1.57553315162659

(sum_ptot_p1 <- plan_wide_19902020 %>%
   select(CODIGO, `Fósforo total`, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(`Fósforo total`, na.rm = TRUE),
     q1 = 
       quantile(`Fósforo total`, 0.25, na.rm = TRUE),
     median = 
       median(`Fósforo total`, na.rm = TRUE),
     mean = 
       mean(`Fósforo total`, na.rm= TRUE),
     q3 = 
       quantile(`Fósforo total`, 0.75, na.rm = TRUE),
     max = 
       max(`Fósforo total`, na.rm = TRUE)))
## # A tibble: 7 x 7
##   CODIGO      min     q1 median   mean     q3   max
##   <chr>     <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
## 1 87398500 0.0097 0.0593 0.0881 0.123  0.14   0.863
## 2 87398900 0.0023 0.0468 0.0678 0.0747 0.0883 0.247
## 3 87398950 0.0202 0.0544 0.0737 0.0751 0.0904 0.179
## 4 87398980 0.01   0.0254 0.0547 0.0708 0.114  0.189
## 5 87405500 0.017  0.171  0.281  0.417  0.492  2.32 
## 6 87406900 0.156  0.270  0.508  0.785  1.07   2.79 
## 7 87409900 0.107  0.258  0.384  0.489  0.712  1.53
(sum_ptot_p2 <- plan_wide_19902020 %>%
    select(CODIGO, `Fósforo total`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Fósforo total`, na.rm = TRUE),
      q1 = 
        quantile(`Fósforo total`, 0.25, na.rm = TRUE),
      median = 
        median(`Fósforo total`, na.rm = TRUE),
      mean = 
        mean(`Fósforo total`, na.rm= TRUE),
      q3 = 
        quantile(`Fósforo total`, 0.75, na.rm = TRUE),
      max = 
        max(`Fósforo total`, na.rm = TRUE)))
## # A tibble: 7 x 7
##   CODIGO      min     q1 median  mean    q3   max
##   <chr>     <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.025  0.094   0.131 0.148 0.16  0.637
## 2 87398900 0.015  0.0764  0.104 0.140 0.164 0.646
## 3 87398950 0.036  0.116   0.171 0.180 0.207 0.485
## 4 87398980 0.0115 0.052   0.076 0.101 0.103 1    
## 5 87405500 0.046  0.261   0.406 0.547 0.681 1.98 
## 6 87406900 0.056  0.338   0.599 0.752 0.967 3.49 
## 7 87409900 0.043  0.325   0.624 0.677 0.989 1.57
(sum_ptot_p3 <- plan_wide_19902020 %>%
    select(CODIGO, `Fósforo total`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Fósforo total`, na.rm = TRUE),
      q1 = 
        quantile(`Fósforo total`, 0.25, na.rm = TRUE),
      median = 
        median(`Fósforo total`, na.rm = TRUE),
      mean = 
        mean(`Fósforo total`, na.rm= TRUE),
      q3 = 
        quantile(`Fósforo total`, 0.75, na.rm = TRUE),
      max = 
        max(`Fósforo total`, na.rm = TRUE)))
## # A tibble: 7 x 7
##   CODIGO     min     q1 median  mean    q3   max
##   <chr>    <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.061 0.118   0.163 0.166 0.186 0.381
## 2 87398900 0.057 0.0935  0.130 0.163 0.168 0.444
## 3 87398950 0.07  0.132   0.156 0.292 0.221 3.11 
## 4 87398980 0.019 0.0625  0.106 0.144 0.170 0.59 
## 5 87405500 0.013 0.187   0.332 0.361 0.45  0.803
## 6 87406900 0.089 0.254   0.364 0.448 0.560 1.26 
## 7 87409900 0.203 0.259   0.369 0.488 0.564 1.7

Time for this code chunk to run: 0.16787314414978

ggsave("ptot_p1.png",
       plot = ptot_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 47 rows containing non-finite values (stat_boxplot).
## Removed 47 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 47 rows containing missing values (position_quasirandom).
ggsave("ptot_p2.png",
       plot = ptot_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 31 rows containing non-finite values (stat_boxplot).
## Removed 31 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 31 rows containing missing values (position_quasirandom).
ggsave("ptot_p3.png",
       plot = ptot_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 54 rows containing non-finite values (stat_boxplot).
## Removed 54 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 54 rows containing missing values (position_quasirandom).
ggsave("ptot_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(ptot_p1, ptot_p2, ptot_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 47 rows containing non-finite values (stat_boxplot).
## Removed 47 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 47 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 31 rows containing non-finite values (stat_boxplot).
## Removed 31 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 31 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 54 rows containing non-finite values (stat_boxplot).
## Removed 54 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 54 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.49269795417786

8.0.4 Escherichia coli

(ecoli_p1 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"1990" &
                               ANO_COLETA<="2000"),
                    aes(CODIGO,
                        `Escherichia coli`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3200,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=800,
            ymax=3200,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=160,
            ymax=800,
            alpha=1,
            fill="#70c18c")+ #classe 2
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=160,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Escherichia coli no período 1990-2000",
        x="Estação",
        y="NMP/100mL")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$`Escherichia coli`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Escherichia coli`, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.639559030532837

(ecoli_p2 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"2000" &
                               ANO_COLETA<="2010"),
                    aes(CODIGO,
                        `Escherichia coli`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3200,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=800,
            ymax=3200,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=160,
            ymax=800,
            alpha=1,
            fill="#70c18c")+ #classe 2
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=160,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Escherichia coli no período 2000-2010",
        x="Estação",
        y="NMP/100mL")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$`Escherichia coli`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Escherichia coli`, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.70834493637085

(ecoli_p3 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"2010" &
                               ANO_COLETA<="2020"),
                    aes(CODIGO,
                        `Escherichia coli`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3200,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=800,
            ymax=3200,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=160,
            ymax=800,
            alpha=1,
            fill="#70c18c")+ #classe 2
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=160,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Escherichia coli no período 2010-2020",
        x="Estação",
        y="NMP/100mL")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$`Escherichia coli`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Escherichia coli`, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.571197032928467

grid.arrange(ecoli_p1, ecoli_p2, ecoli_p3, ncol = 3)

Time for this code chunk to run: 1.79762291908264

(sum_ecoli_p1 <- plan_wide_19902020 %>%
   select(CODIGO, `Escherichia coli`, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(`Escherichia coli`, 
           na.rm = TRUE),
     q1 = 
       quantile(`Escherichia coli`, 0.25, 
                na.rm = TRUE),
     median = 
       median(`Escherichia coli`, 
              na.rm = TRUE),
     mean = 
       mean(`Escherichia coli`, 
            na.rm= TRUE),
     q3 = 
       quantile(`Escherichia coli`, 0.75, 
                na.rm = TRUE),
     max = 
       max(`Escherichia coli`, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median   mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
## 1 87398500  32   136     240   854.    720 19200
## 2 87398900  16    68     160   548.    480  7760
## 3 87398950   2.4  12.8   268  4039.  10000 28000
## 4 87398980   4   160     243. 2907.    446 25600
## 5 87405500   1.6  12.8    24   545.    128 18400
## 6 87406900  13.6  61.6   192   718.    414 12800
## 7 87409900   2.4  12.8    64    97.7   128   720
(sum_ecoli_p2 <- plan_wide_19902020 %>%
    select(CODIGO, `Escherichia coli`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Escherichia coli`, 
            na.rm = TRUE),
      q1 = 
        quantile(`Escherichia coli`, 0.25, 
                 na.rm = TRUE),
      median = 
        median(`Escherichia coli`, 
               na.rm = TRUE),
      mean = 
        mean(`Escherichia coli`, 
             na.rm= TRUE),
      q3 = 
        quantile(`Escherichia coli`, 0.75, 
                 na.rm = TRUE),
      max = 
        max(`Escherichia coli`, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median   mean     q3    max
##   <chr>    <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 87398500  21.6   91    150   1335.   308   27200
## 2 87398900  11     70    133.   444.   414.   2600
## 3 87398950  20    400    720    935.  1120    5500
## 4 87398980  24    110.   195    410.   289.   8800
## 5 87405500   4.7  162   2400  25445. 12950  490000
## 6 87406900   8    172  12800  66370. 62300  650000
## 7 87409900  16   7355. 35500  72440. 68750  460000
(sum_ecoli_p3 <- plan_wide_19902020 %>%
    select(CODIGO, `Escherichia coli`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Escherichia coli`, 
            na.rm = TRUE),
      q1 = 
        quantile(`Escherichia coli`, 0.25, 
                 na.rm = TRUE),
      median = 
        median(`Escherichia coli`, 
               na.rm = TRUE),
      mean = 
        mean(`Escherichia coli`, 
             na.rm= TRUE),
      q3 = 
        quantile(`Escherichia coli`, 0.75, 
                 na.rm = TRUE),
      max = 
        max(`Escherichia coli`, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO      min      q1 median    mean      q3      max
##   <chr>     <dbl>   <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
## 1 87398500   90     155.    260     409.    451     2420 
## 2 87398900   10      52.8   107     245.    313     1553.
## 3 87398950  108.    250     487    1424.   1553.   10462 
## 4 87398980   40.8   140.    242.    529.    738.    2400 
## 5 87405500  632    8965   19232. 109992.  70750  1400000 
## 6 87406900 1440   23100   34500  230828. 140500  3400000 
## 7 87409900 2000   20100   38400   83128.  83680   345000

Time for this code chunk to run: 0.26286506652832

ggsave("ecoli_p1.png",
       plot = ecoli_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 15 rows containing non-finite values (stat_boxplot).
## Removed 15 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 15 rows containing missing values (position_quasirandom).
ggsave("ecoli_p2.png",
       plot = ecoli_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 66 rows containing non-finite values (stat_boxplot).
## Removed 66 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 66 rows containing missing values (position_quasirandom).
ggsave("ecoli_p3.png",
       plot = ecoli_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 14 rows containing non-finite values (stat_boxplot).
## Removed 14 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 14 rows containing missing values (position_quasirandom).
ggsave("ecoli_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(ecoli_p1, ecoli_p2, ecoli_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 15 rows containing non-finite values (stat_boxplot).
## Removed 15 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 15 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 66 rows containing non-finite values (stat_boxplot).
## Removed 66 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 66 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 14 rows containing non-finite values (stat_boxplot).
## Removed 14 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 14 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.89907503128052

8.0.5 Nitrogênio amoniacal

(namon_p1 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"1990" &
                               ANO_COLETA<="2000"),
                    aes(CODIGO,
                        `Nitrogênio total`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 1990-2000",
        x="Estação",
        y="mg/L")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$`Nitrogênio total`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Nitrogênio total`, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.66457986831665

(namon_p2 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"2000" &
                               ANO_COLETA<="2010"),
                    aes(CODIGO,
                        `Nitrogênio total`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 2000-2010",
        x="Estação",
        y="mg/L")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$`Nitrogênio total`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Nitrogênio total`, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.793928861618042

(namon_p3 <- ggplot(plan_wide_19902020 %>% 
                      filter(ANO_COLETA>"2010" &
                               ANO_COLETA<="2020"),
                    aes(CODIGO,
                        `Nitrogênio total`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=13.3,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=3.7,
            ymax=13.3,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=3.7,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Nitrogênio amoniacal no período 2010-2020",
        x="Estação",
        y="mg/L")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 9,
                      limits = c(min(plan_wide_19902020$`Nitrogênio total`, na.rm = TRUE),
                                 max(plan_wide_19902020$`Nitrogênio total`, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = .001,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.574903011322021

grid.arrange(namon_p1, namon_p2, namon_p3, ncol = 3)

Time for this code chunk to run: 1.60094785690308

(sum_namon_p1 <- plan_wide_19902020 %>%
   select(CODIGO, `Nitrogênio total`, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(`Nitrogênio total`, 
           na.rm = TRUE),
     q1 = 
       quantile(`Nitrogênio total`, 0.25, 
                na.rm = TRUE),
     median = 
       median(`Nitrogênio total`, 
              na.rm = TRUE),
     mean = 
       mean(`Nitrogênio total`, 
            na.rm= TRUE),
     q3 = 
       quantile(`Nitrogênio total`, 0.75, 
                na.rm = TRUE),
     max = 
       max(`Nitrogênio total`, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.44  0.842  1.00  1.22   1.34  3.81
## 2 87398900 0.22  0.82   1     1.09   1.25  4.86
## 3 87398950 0.51  0.83   1.02  1.06   1.19  2.16
## 4 87398980 0.549 0.68   0.755 0.872  1.01  1.85
## 5 87405500 0.51  1.53   2.94  5.27   6.77 21.6 
## 6 87406900 1.34  2.60   4.56  7.58  11.2  29.1 
## 7 87409900 0.5   1.98   4.29  5.18   7.01 19.6
(sum_namon_p2 <- plan_wide_19902020 %>%
    select(CODIGO, `Nitrogênio total`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Nitrogênio total`, 
            na.rm = TRUE),
      q1 = 
        quantile(`Nitrogênio total`, 0.25, 
                 na.rm = TRUE),
      median = 
        median(`Nitrogênio total`, 
               na.rm = TRUE),
      mean = 
        mean(`Nitrogênio total`, 
             na.rm= TRUE),
      q3 = 
        quantile(`Nitrogênio total`, 0.75, 
                 na.rm = TRUE),
      max = 
        max(`Nitrogênio total`, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.18  0.885  0.992  1.80  1.46 23.2 
## 2 87398900 0.48  0.894  1.13   1.38  1.57  7.92
## 3 87398950 0.57  1.26   1.45   1.43  1.71  1.98
## 4 87398980 0.19  0.685  0.79   1.05  1.10  5.2 
## 5 87405500 0.968 2      3.29   5.45  6.60 21.7 
## 6 87406900 0.77  2.4    4.54   7.30 10.2  39.1 
## 7 87409900 1.62  2.5    6.97   7.92 10.6  21.5
(sum_namon_p3 <- plan_wide_19902020 %>%
    select(CODIGO, `Nitrogênio total`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Nitrogênio total`, 
            na.rm = TRUE),
      q1 = 
        quantile(`Nitrogênio total`, 0.25, 
                 na.rm = TRUE),
      median = 
        median(`Nitrogênio total`, 
               na.rm = TRUE),
      mean = 
        mean(`Nitrogênio total`, 
             na.rm= TRUE),
      q3 = 
        quantile(`Nitrogênio total`, 0.75, 
                 na.rm = TRUE),
      max = 
        max(`Nitrogênio total`, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500 0.222 0.89    1.11  1.24  1.41  2.56
## 2 87398900 0.095 0.883   1.02  1.29  1.40  4.25
## 3 87398950 0.612 1.04    1.43  1.90  2.06  9.5 
## 4 87398980 0.216 0.973   1.12  1.22  1.58  2.32
## 5 87405500 1.12  2.03    3.14  4.50  5.93 22.0 
## 6 87406900 1.37  2.40    5.58  6.47  7.58 25   
## 7 87409900 1.11  3       6.15  7.29  7.75 36

Time for this code chunk to run: 0.210697174072266

ggsave("namon_p1.png",
       plot = namon_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 102 rows containing non-finite values (stat_boxplot).
## Removed 102 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 102 rows containing missing values (position_quasirandom).
ggsave("namon_p2.png",
       plot = namon_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 110 rows containing non-finite values (stat_boxplot).
## Removed 110 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 110 rows containing missing values (position_quasirandom).
ggsave("namon_p3.png",
       plot = namon_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 70 rows containing non-finite values (stat_boxplot).
## Removed 70 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 70 rows containing missing values (position_quasirandom).
ggsave("namon_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(namon_p1, namon_p2, namon_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 102 rows containing non-finite values (stat_boxplot).
## Removed 102 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 102 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 110 rows containing non-finite values (stat_boxplot).
## Removed 110 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 110 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 70 rows containing non-finite values (stat_boxplot).
## Removed 70 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 70 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.537593126297

8.0.6 Turbidez

(turb_p1 <- ggplot(plan_wide_19902020 %>% 
                     filter(ANO_COLETA>"1990" &
                              ANO_COLETA<="2000"),
                   aes(CODIGO,
                       Turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 1990-2000",
        x="Estação",
        y="UNT")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$Turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$Turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900",
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.655518054962158

(turb_p2 <- ggplot(plan_wide_19902020 %>% 
                     filter(ANO_COLETA>"2000" &
                              ANO_COLETA<="2010"),
                   aes(CODIGO,
                       Turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 2000-2010",
        x="Estação",
        y="UNT")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$Turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$Turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.635492086410522

(turb_p3 <- ggplot(plan_wide_19902020 %>% 
                     filter(ANO_COLETA>"2010" &
                              ANO_COLETA<="2020"),
                   aes(CODIGO,
                       Turbidez))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=100,
            ymax=Inf,
            alpha=1,
            fill="#ac5079")+ #>pior classe
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=40,
            ymax=100,
            alpha=1,
            fill="#fcf7ab")+ #classe 3
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=0,
            ymax=40,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Turbidez no período 2010-2020",
        x="Estação",
        y="UNT")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.05, 0.03)),
                      n.breaks = 8,
                      limits = c(min(plan_wide_19902020$Turbidez, na.rm = TRUE),
                                 max(plan_wide_19902020$Turbidez, na.rm = TRUE)),
                      trans = "log10",
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.578914880752563

grid.arrange(turb_p1, turb_p2, turb_p3, ncol = 3)

Time for this code chunk to run: 1.92813014984131

(sum_turb_p1 <- plan_wide_19902020 %>%
   select(CODIGO, Turbidez, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(Turbidez, 
           na.rm = TRUE),
     q1 = 
       quantile(Turbidez, 0.25, 
                na.rm = TRUE),
     median = 
       median(Turbidez, 
              na.rm = TRUE),
     mean = 
       mean(Turbidez, 
            na.rm= TRUE),
     q3 = 
       quantile(Turbidez, 0.75, 
                na.rm = TRUE),
     max = 
       max(Turbidez, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   6.2  19     34.5  63.5  67     461
## 2 87398900   9    19     49.5  61.5  73.8   460
## 3 87398950   9.6  16     22    33.3  48.8   144
## 4 87398980  16    32.8   43    66.8  90.5   190
## 5 87405500   8.5  23.5   47    47.5  58     159
## 6 87406900  33    54.8   67    77.7  81.5   199
## 7 87409900   5.8  15     25    32.2  48      76
(sum_turb_p2 <- plan_wide_19902020 %>%
    select(CODIGO, Turbidez, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(Turbidez, 
            na.rm = TRUE),
      q1 = 
        quantile(Turbidez, 0.25, 
                 na.rm = TRUE),
      median = 
        median(Turbidez, 
               na.rm = TRUE),
      mean = 
        mean(Turbidez, 
             na.rm= TRUE),
      q3 = 
        quantile(Turbidez, 0.75, 
                 na.rm = TRUE),
      max = 
        max(Turbidez, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500     9  41.2   55.5  71.1  74.2   428
## 2 87398900    39  57     78   107.  116.    475
## 3 87398950    39  47     64    96.5  90     330
## 4 87398980    24  37     50    64.5  87     176
## 5 87405500    32  46     63.5  70.3  76     341
## 6 87406900    35  49     62    69.9  75.5   284
## 7 87409900    40  45     60    70.4  90     151
(sum_turb_p3 <- plan_wide_19902020 %>%
    select(CODIGO, Turbidez, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(Turbidez, 
            na.rm = TRUE),
      q1 = 
        quantile(Turbidez, 0.25, 
                 na.rm = TRUE),
      median = 
        median(Turbidez, 
               na.rm = TRUE),
      mean = 
        mean(Turbidez, 
             na.rm= TRUE),
      q3 = 
        quantile(Turbidez, 0.75, 
                 na.rm = TRUE),
      max = 
        max(Turbidez, 
            na.rm = TRUE))
) 
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  8.52  16.4   29    33.3  43     85 
## 2 87398900 14.8   39.2   48.3  66.7  73.4  299 
## 3 87398950 16     29.9   41    51.6  65    230 
## 4 87398980 11     19.4   33.6  39.5  42.2  110.
## 5 87405500 10.0   29.0   41    42.9  54.5  131 
## 6 87406900  9.62  23     39    41.2  52    122 
## 7 87409900  9.68  22.0   34.0  40.5  47    182.

Time for this code chunk to run: 0.181600093841553

ggsave("turb_p1.png",
       plot = turb_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 56 rows containing non-finite values (stat_boxplot).
## Removed 56 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 56 rows containing missing values (position_quasirandom).
ggsave("turb_p2.png",
       plot = turb_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 74 rows containing non-finite values (stat_boxplot).
## Removed 74 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 74 rows containing missing values (position_quasirandom).
ggsave("turb_p3.png",
       plot = turb_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 14 rows containing non-finite values (stat_boxplot).
## Removed 14 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 14 rows containing missing values (position_quasirandom).
ggsave("turb_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(turb_p1, turb_p2, turb_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 56 rows containing non-finite values (stat_boxplot).
## Removed 56 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 56 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 74 rows containing non-finite values (stat_boxplot).
## Removed 74 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 74 rows containing missing values (position_quasirandom).
## Warning: Transformation introduced infinite values in continuous y-axis
## Warning: Removed 14 rows containing non-finite values (stat_boxplot).
## Removed 14 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 14 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 5.0116081237793

8.0.7 pH

(pH_p1 <- ggplot(plan_wide_19902020 %>% 
                   filter(ANO_COLETA>"1990" &
                            ANO_COLETA<="2000"),
                 aes(CODIGO,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 1990-2000",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.809675931930542

(pH_p2 <- ggplot(plan_wide_19902020 %>% 
                   filter(ANO_COLETA>"2000" &
                            ANO_COLETA<="2010"),
                 aes(CODIGO,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 2000-2010",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900",
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 1.01124382019043

(pH_p3 <- ggplot(plan_wide_19902020 %>% 
                   filter(ANO_COLETA>"2010" &
                            ANO_COLETA<="2020"),
                 aes(CODIGO,
                     pH))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=6,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=9,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=6,
            ymax=9,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "pH no período 2010-2020",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.01)),
                      n.breaks = 8,
                      limits = c(4,11),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900",
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.880383014678955

grid.arrange(pH_p1, pH_p2, pH_p3, ncol = 3)

Time for this code chunk to run: 1.74953007698059

(sum_pH_p1 <- plan_wide_19902020 %>%
   select(CODIGO, pH, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(pH, 
           na.rm = TRUE),
     q1 = 
       quantile(pH, 0.25, 
                na.rm = TRUE),
     median = 
       median(pH, 
              na.rm = TRUE),
     mean = 
       mean(pH, 
            na.rm= TRUE),
     q3 = 
       quantile(pH, 0.75, 
                na.rm = TRUE),
     max = 
       max(pH, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   5    6.18   6.59  6.51  6.82   7.9
## 2 87398900   5.2  6      6.3   6.33  6.63   7.9
## 3 87398950   5.4  6.29   6.4   6.49  6.72   8.1
## 4 87398980   5.3  5.93   6.2   6.16  6.3    7.3
## 5 87405500   5    6.3    6.4   6.47  6.7    9.3
## 6 87406900   5.5  6.18   6.45  6.43  6.8    7.3
## 7 87409900   4.5  6.2    6.4   6.44  6.7    7.4
(sum_pH_p2 <- plan_wide_19902020 %>%
    select(CODIGO, pH, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(pH, 
            na.rm = TRUE),
      q1 = 
        quantile(pH, 0.25, 
                 na.rm = TRUE),
      median = 
        median(pH, 
               na.rm = TRUE),
      mean = 
        mean(pH, 
             na.rm= TRUE),
      q3 = 
        quantile(pH, 0.75, 
                 na.rm = TRUE),
      max = 
        max(pH, 
            na.rm = TRUE))
) 
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   5.3   6.3   6.6   6.59  6.88   7.9
## 2 87398900   5.5   6.4   6.65  6.63  6.9    7.5
## 3 87398950   6     6.6   6.8   6.89  7.25   7.6
## 4 87398980   5.8   6.3   6.5   6.63  7      7.5
## 5 87405500   5.2   6.4   6.6   6.68  6.9    8.3
## 6 87406900   5.5   6.4   6.7   6.66  6.9    8.6
## 7 87409900   5.8   6.5   6.8   6.77  7      8.4
(sum_pH_p3 <- plan_wide_19902020 %>%
    select(CODIGO, pH, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(pH, 
            na.rm = TRUE),
      q1 = 
        quantile(pH, 0.25, 
                 na.rm = TRUE),
      median = 
        median(pH, 
               na.rm = TRUE),
      mean = 
        mean(pH, 
             na.rm= TRUE),
      q3 = 
        quantile(pH, 0.75, 
                 na.rm = TRUE),
      max = 
        max(pH, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  5.47  6.28   6.42  6.47  6.60  7.3 
## 2 87398900  5.68  6.36   6.5   6.57  6.84  7.4 
## 3 87398950  5.71  6.28   6.46  6.46  6.68  7   
## 4 87398980  5.42  6.10   6.36  6.39  6.6   7.2 
## 5 87405500  5.64  6.34   6.5   6.49  6.7   7.01
## 6 87406900  5.6   6.4    6.48  6.51  6.77  7.3 
## 7 87409900  5.59  6.46   6.6   6.57  6.76  7.2

Time for this code chunk to run: 0.148488998413086

ggsave("pH_p1.png",
       plot = pH_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 1 rows containing non-finite values (stat_boxplot).
## Removed 1 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 1 rows containing missing values (position_quasirandom).
ggsave("pH_p2.png",
       plot = pH_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 73 rows containing non-finite values (stat_boxplot).
## Removed 73 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 73 rows containing missing values (position_quasirandom).
ggsave("pH_p3.png",
       plot = pH_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 14 rows containing non-finite values (stat_boxplot).
## Removed 14 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 14 rows containing missing values (position_quasirandom).
ggsave("pH_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(pH_p1, pH_p2, pH_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Removed 1 rows containing non-finite values (stat_boxplot).
## Warning: Removed 1 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 1 rows containing missing values (position_quasirandom).
## Warning: Removed 73 rows containing non-finite values (stat_boxplot).
## Removed 73 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 73 rows containing missing values (position_quasirandom).
## Warning: Removed 14 rows containing non-finite values (stat_boxplot).
## Removed 14 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 14 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.25967407226562

8.0.8 Sólidos totais

(SolTot_p1 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"1990" &
                                ANO_COLETA<="2000"),
                     aes(CODIGO,
                         `Sólidos totais`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Sólidos totais no período 1990-2000",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$`Sólidos totais`, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.619378089904785

(SolTot_p2 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"2000" &
                                ANO_COLETA<="2010"),
                     aes(CODIGO,
                         `Sólidos totais`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Sólidos totais no período 2000-2010",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$`Sólidos totais`, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900",
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.641588926315308

(SolTot_p3 <- ggplot(plan_wide_19902020 %>% 
                       filter(ANO_COLETA>"2010" &
                                ANO_COLETA<="2020"),
                     aes(CODIGO,
                         `Sólidos totais`))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Sólidos totais no período 2010-2020",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$`Sólidos totais`, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900",
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme_grafs()
)

Time for this code chunk to run: 0.505672931671143

grid.arrange(SolTot_p1, SolTot_p2, SolTot_p3, ncol = 3)

Time for this code chunk to run: 1.56480097770691

(sum_SolTot_p1 <- plan_wide_19902020 %>%
   select(CODIGO, `Sólidos totais`, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(`Sólidos totais`, 
           na.rm = TRUE),
     q1 = 
       quantile(`Sólidos totais`, 0.25, 
                na.rm = TRUE),
     median = 
       median(`Sólidos totais`, 
              na.rm = TRUE),
     mean = 
       mean(`Sólidos totais`, 
            na.rm= TRUE),
     q3 = 
       quantile(`Sólidos totais`, 0.75, 
                na.rm = TRUE),
     max = 
       max(`Sólidos totais`, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    46  84.5   95   122.   120    510
## 2 87398900    18  74.5   97   111.   122.   474
## 3 87398950    10  76.5   91    90.9  106.   155
## 4 87398980    48  63.5   81.5 104.   126.   337
## 5 87405500    70 101    121   133.   151    361
## 6 87406900    89 118    155   165.   210    279
## 7 87409900    20  99.5  122   128.   143    381
(sum_SolTot_p2 <- plan_wide_19902020 %>%
    select(CODIGO, `Sólidos totais`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Sólidos totais`, 
            na.rm = TRUE),
      q1 = 
        quantile(`Sólidos totais`, 0.25, 
                 na.rm = TRUE),
      median = 
        median(`Sólidos totais`, 
               na.rm = TRUE),
      mean = 
        mean(`Sólidos totais`, 
             na.rm= TRUE),
      q3 = 
        quantile(`Sólidos totais`, 0.75, 
                 na.rm = TRUE),
      max = 
        max(`Sólidos totais`, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    28  80     100  111.   123.   412
## 2 87398900    42  82     102. 128.   140.   489
## 3 87398950    46  94.2   108. 126.   127.   318
## 4 87398980    40  61      77   85.3   96    228
## 5 87405500    48 102     133  148.   170.   522
## 6 87406900    50 109     134. 154.   170.   670
## 7 87409900    56 112.    156  167.   190.   599
(sum_SolTot_p3 <- plan_wide_19902020 %>%
    select(CODIGO, `Sólidos totais`, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(`Sólidos totais`, 
            na.rm = TRUE),
      q1 = 
        quantile(`Sólidos totais`, 0.25, 
                 na.rm = TRUE),
      median = 
        median(`Sólidos totais`, 
               na.rm = TRUE),
      mean = 
        mean(`Sólidos totais`, 
             na.rm= TRUE),
      q3 = 
        quantile(`Sólidos totais`, 0.75, 
                 na.rm = TRUE),
      max = 
        max(`Sólidos totais`, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500    61  69      90   82.8   96    101
## 2 87398900    41  77     104  120.   127    308
## 3 87398950    45  93     101  109.   117    221
## 4 87398980    55  62.8    80   79.9   95    109
## 5 87405500    83  89.2   108. 124.   162.   195
## 6 87406900    50 106     117  135.   163    246
## 7 87409900    75 103     115  131.   145    251

Time for this code chunk to run: 0.181599140167236

ggsave("SolTot_p1.png",
       plot = SolTot_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 10 rows containing non-finite values (stat_boxplot).
## Removed 10 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 10 rows containing missing values (position_quasirandom).
ggsave("SolTot_p2.png",
       plot = SolTot_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 7 rows containing non-finite values (stat_boxplot).
## Removed 7 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 7 rows containing missing values (position_quasirandom).
ggsave("SolTot_p3.png",
       plot = SolTot_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 125 rows containing non-finite values (stat_boxplot).
## Removed 125 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 125 rows containing missing values (position_quasirandom).
ggsave("SolTot_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(SolTot_p1, SolTot_p2, SolTot_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Removed 10 rows containing non-finite values (stat_boxplot).
## Warning: Removed 10 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 10 rows containing missing values (position_quasirandom).
## Warning: Removed 7 rows containing non-finite values (stat_boxplot).
## Removed 7 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 7 rows containing missing values (position_quasirandom).
## Warning: Removed 125 rows containing non-finite values (stat_boxplot).
## Removed 125 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 125 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.48719596862793

8.0.9 IQA

Time for this code chunk to run: 0.659180164337158

Time for this code chunk to run: 0.641683101654053

Time for this code chunk to run: 0.634097099304199

grid.arrange(iqa_p1, iqa_p2, iqa_p3, ncol = 3)

Time for this code chunk to run: 1.50327396392822

(sum_IQA_p1 <- plan_wide_19902020 %>%
   select(CODIGO, IQA, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(IQA, 
           na.rm = TRUE),
     q1 = 
       quantile(IQA, 0.25, 
                na.rm = TRUE),
     median = 
       median(IQA, 
              na.rm = TRUE),
     mean = 
       mean(IQA, 
            na.rm= TRUE),
     q3 = 
       quantile(IQA, 0.75, 
                na.rm = TRUE),
     max = 
       max(IQA, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  27.0  35.7   40.9  40.7  46.2  52.2
## 2 87398900  27.8  37.9   42.9  43.0  48.0  58.5
## 3 87398950  32.8  36.8   41.4  43.2  48.6  61.9
## 4 87398980  29.2  35.8   40.4  40.3  44.8  51.9
## 5 87405500  24.8  34.9   41.2  40.3  46.9  57.6
## 6 87406900  24.7  31.3   37.8  37.4  44.4  49.0
## 7 87409900  23.6  31.9   37.1  38.8  46.2  55.4
(sum_IQA_p2 <- plan_wide_19902020 %>%
    select(CODIGO, IQA, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(IQA, 
            na.rm = TRUE),
      q1 = 
        quantile(IQA, 0.25, 
                 na.rm = TRUE),
      median = 
        median(IQA, 
               na.rm = TRUE),
      mean = 
        mean(IQA, 
             na.rm= TRUE),
      q3 = 
        quantile(IQA, 0.75, 
                 na.rm = TRUE),
      max = 
        max(IQA, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  27.8  34.6   40.0  39.5  43.5  48.7
## 2 87398900  28.5  35.1   37.6  38.3  40.6  48.5
## 3 87398950  21.1  29.4   32.7  32.8  36.8  44.0
## 4 87398980  24.5  35.7   39.4  39.5  43.4  52.1
## 5 87405500  19.8  28.7   31.5  31.9  35.7  48.8
## 6 87406900  17.1  25.3   29.0  29.5  32.8  44.1
## 7 87409900  16.2  20.5   26.1  25.0  29.8  33.1
(sum_IQA_p3 <- plan_wide_19902020 %>%
    select(CODIGO, IQA, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(IQA, 
            na.rm = TRUE),
      q1 = 
        quantile(IQA, 0.25, 
                 na.rm = TRUE),
      median = 
        median(IQA, 
               na.rm = TRUE),
      mean = 
        mean(IQA, 
             na.rm= TRUE),
      q3 = 
        quantile(IQA, 0.75, 
                 na.rm = TRUE),
      max = 
        max(IQA, 
            na.rm = TRUE),
      n = 
        length(IQA))
)
## # A tibble: 7 x 8
##   CODIGO     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  40.2  42.5   45.4  44.2  45.5  47.2    34
## 2 87398900  34.1  38.6   41.2  40.2  42.9  44.4    36
## 3 87398950  36.7  39.5   42.4  41.5  44.4  44.6    35
## 4 87398980  40.0  40.0   40.0  40.0  40.0  40.0    28
## 5 87405500  30.8  31.6   32.5  32.5  33.3  34.1    33
## 6 87406900  22.9  24.4   25.9  25.3  26.5  27.2    35
## 7 87409900  24.1  25.1   27.3  26.9  28.2  29.7    37
plan_wide_19902020 %>% 
  select(CODIGO, IQA) %>% 
  group_by(CODIGO) %>% 
  summarize(
    min = 
      min(IQA, 
          na.rm = TRUE),
    q1 = 
      quantile(IQA, 0.25, 
               na.rm = TRUE),
    median = 
      median(IQA, 
             na.rm = TRUE),
    mean = 
      mean(IQA, 
           na.rm= TRUE),
    q3 = 
      quantile(IQA, 0.75, 
               na.rm = TRUE),
    max = 
      max(IQA, 
          na.rm = TRUE))
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  27.0  35.6   40.7  40.5  45.4  52.2
## 2 87398900  27.8  36.4   40.7  41.4  46.1  58.5
## 3 87398950  21.1  36.6   40.7  41.8  47.4  61.9
## 4 87398980  24.5  35.7   39.7  39.9  44.1  52.1
## 5 87405500  19.8  29.9   36.9  37.3  44.0  57.6
## 6 87406900  17.1  25.7   31.1  32.4  38.0  49.0
## 7 87409900  16.2  28.1   33.2  35.3  42.7  55.4

Time for this code chunk to run: 0.219724178314209

ggsave("iqa_p1.png",
       plot = iqa_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 164 rows containing missing values (position_quasirandom).
ggsave("iqa_p2.png",
       plot = iqa_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 253 rows containing missing values (position_quasirandom).
ggsave("iqa_p3.png",
       plot = iqa_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 214 rows containing missing values (position_quasirandom).
ggsave("iqa_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(iqa_p1, iqa_p2, iqa_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 164 rows containing missing values (position_quasirandom).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 253 rows containing missing values (position_quasirandom).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 214 rows containing missing values (position_quasirandom).
## Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 4.45543909072876

8.1 Testando coisas

8.1.1 Correlação

parametros_IQA <- plan_wide_19902020 %>%
  select(CODIGO,
         pH,
         DBO,
         `Nitrogênio amoniacal`,
         `Nitrogênio total`,
         `Fósforo total`,
         `Temperatura água`,
         Turbidez,
         `Sólidos totais`,
         `Oxigênio dissolvido`,
         Condutividade)

write.csv(parametros_IQA,
          "./parametros_IQA.csv",
          row.names = FALSE)

parametros_IQA %>% 
  select(-CODIGO) %>% 
  ggcorr(method = "complete.obs",
           # "pearson",
           # "pairwise",
         name = "Correlação",
         label = TRUE,
         label_alpha = TRUE,
         digits = 3,
         low = "#3B9AB2",
         mid = "#EEEEEE",
         high = "#F21A00",
         # palette = "RdYlBu",
         layout.exp = 0,
         legend.position = "left",
         label_round = 3,
         )

# Gráfico das correlações entre todos os parâmetros com significância
# correl_IQA <- parametros_IQA %>% 
#   select(-CODIGO) %>% 
#   ggpairs(title = "Correlação entre parâmetros que compõem o IQA",
#           axisLabels = "show")

Time for this code chunk to run: 0.677247047424316

8.1.2 Condutividade elétrica

(cond_elet_p1 <- ggplot(plan_wide_19902020 %>% 
                          filter(ANO_COLETA>"1990" &
                                   ANO_COLETA<="2000"),
                        aes(CODIGO,
                            Condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Condutividade elétrica no período 1990-2000",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$Condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900",
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme(
     plot.title = element_text(
       hjust = 0.5,
       color = "black",
       size = 19),
     axis.title.y = element_text(
       color = "black",
       size = 15),
     axis.text.y = element_text(
       color = "black",
       size = 17),
     axis.text.x = element_text(
       color = "black",
       size = 17),
   )
)

Time for this code chunk to run: 0.767904043197632

(cond_elet_p2 <- ggplot(plan_wide_19902020 %>% 
                          filter(ANO_COLETA>"2000" &
                                   ANO_COLETA<="2010"),
                        aes(CODIGO,
                            Condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Condutividade elétrica no período 1990-2000",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$Condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900", 
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme(
     plot.title = element_text(
       hjust = 0.5,
       color = "black",
       size = 19),
     axis.title.y = element_text(
       color = "black",
       size = 15),
     axis.text.y = element_text(
       color = "black",
       size = 17),
     axis.text.x = element_text(
       color = "black",
       size = 17),
   )
)

Time for this code chunk to run: 0.787135124206543

(cond_elet_p3 <- ggplot(plan_wide_19902020 %>% 
                          filter(ANO_COLETA>"2010" &
                                   ANO_COLETA<="2020"),
                        aes(CODIGO,
                            Condutividade))+
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=500,
            ymax=Inf,
            alpha=1,
            fill="#eb5661")+ #classe 4
   annotate("rect",
            xmin=-Inf,
            xmax=Inf,
            ymin=-Inf,
            ymax=500,
            alpha=1,
            fill="#8dcdeb")+ #classe 1
   stat_boxplot(geom = 'errorbar',
                width=0.3,
                position = position_dodge(width = 0.65))+
   geom_boxplot(fill='#F8F8FF',
                color="black",
                outlier.shape = NA, #se deixar NA fica só o jitter, se não, deixa 1
                width= 0.7)+
   labs(title = "Condutividade elétrica no período 1990-2000",
        x="Estação",
        y="")+
   ggbeeswarm::geom_quasirandom(
     size = 1.2,
     alpha = .25,
     width = .07,
   )+
   scale_y_continuous(expand = expansion(mult = c(0.01, 0.05)),
                      n.breaks = 8,
                      limits = c(0,
                                 max(plan_wide_19902020$Condutividade, na.rm = TRUE)),
                      labels = scales::number_format(accuracy = 1,
                                                     decimal.mark = ",",
                                                     big.mark = " "))+
   scale_x_discrete(limits = c("87398500", "87398980", "87398900",
                               "87398950", "87405500", "87406900", "87409900"))+
   geom_smooth(method = "lm",
               se=FALSE, #se deixar TRUE gera o intervalo de confiança de 95%
               aes(group=1),
               alpha=.5,
               na.rm = TRUE,
               size = 1)+
   theme(
     plot.title = element_text(
       hjust = 0.5,
       color = "black",
       size = 19),
     axis.title.y = element_text(
       color = "black",
       size = 15),
     axis.text.y = element_text(
       color = "black",
       size = 17),
     axis.text.x = element_text(
       color = "black",
       size = 17),
   )
)

Time for this code chunk to run: 1.04782104492188

grid.arrange(cond_elet_p1, cond_elet_p2, cond_elet_p3, ncol = 3)

Time for this code chunk to run: 2.79926705360413

(sum_cond_elet_p1 <- plan_wide_19902020 %>%
   select(CODIGO, Condutividade, ANO_COLETA) %>% 
   filter(ANO_COLETA>"1990" &
            ANO_COLETA<="2000") %>% 
   group_by(CODIGO) %>% 
   summarize(
     min = 
       min(Condutividade, 
           na.rm = TRUE),
     q1 = 
       quantile(Condutividade, 0.25, 
                na.rm = TRUE),
     median = 
       median(Condutividade, 
              na.rm = TRUE),
     mean = 
       mean(Condutividade, 
            na.rm= TRUE),
     q3 = 
       quantile(Condutividade, 0.75, 
                na.rm = TRUE),
     max = 
       max(Condutividade, 
           na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500   9.4  51.1   67    75.1  83.2 340  
## 2 87398900  10    41.5   51    55.3  64.2 160  
## 3 87398950   9    41.5   51.5  60.1  69.5 160  
## 4 87398980  11.3  42.4   52.0  53.0  67.0  83.8
## 5 87405500  25    68.7   88.2 130.  170   560  
## 6 87406900  52    88.4  133.  193.  256.  576  
## 7 87409900  29    80    110.  134.  168.  460
(sum_cond_elet_p2 <- plan_wide_19902020 %>%
    select(CODIGO, Condutividade, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2000" &
             ANO_COLETA<="2010") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(Condutividade, 
            na.rm = TRUE),
      q1 = 
        quantile(Condutividade, 0.25, 
                 na.rm = TRUE),
      median = 
        median(Condutividade, 
               na.rm = TRUE),
      mean = 
        mean(Condutividade, 
             na.rm= TRUE),
      q3 = 
        quantile(Condutividade, 0.75, 
                 na.rm = TRUE),
      max = 
        max(Condutividade, 
            na.rm = TRUE))
)
## # A tibble: 7 x 7
##   CODIGO     min    q1 median  mean    q3   max
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl>
## 1 87398500  11.9  67.0   82.6  84.8 102.   164.
## 2 87398900  11    44.4   52.3  57.1  72.6  136.
## 3 87398950  39.8  58.4   76    82.3  98.3  160 
## 4 87398980   9.4  42.4   49.7  51.5  62    114.
## 5 87405500  17    77.5  107   142.  171.   679 
## 6 87406900  23.1  85.6  124.  164.  199.   619 
## 7 87409900  56.1 114.   177   200.  242    454
(sum_cond_elet_p3 <- plan_wide_19902020 %>%
    select(CODIGO, Condutividade, ANO_COLETA) %>% 
    filter(ANO_COLETA>"2010" &
             ANO_COLETA<="2020") %>% 
    group_by(CODIGO) %>% 
    summarize(
      min = 
        min(Condutividade, 
            na.rm = TRUE),
      q1 = 
        quantile(Condutividade, 0.25, 
                 na.rm = TRUE),
      median = 
        median(Condutividade, 
               na.rm = TRUE),
      mean = 
        mean(Condutividade, 
             na.rm= TRUE),
      q3 = 
        quantile(Condutividade, 0.75, 
                 na.rm = TRUE),
      max = 
        max(Condutividade, 
            na.rm = TRUE),
      n = 
        length(Condutividade))
)
## # A tibble: 7 x 8
##   CODIGO     min    q1 median  mean    q3   max     n
##   <chr>    <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <int>
## 1 87398500  0.01  68.5   80.2  80.4  99.5 125.     34
## 2 87398900 39.7   53.4   58.3  61.1  65.5 103      36
## 3 87398950 40.9   64.7   70.1  76.1  82.5 195.     35
## 4 87398980 43.2   51.7   54.0  56.3  61.0  78.9    28
## 5 87405500 47     85.8  121.  146.  209.  286      33
## 6 87406900 62.7   95.9  142.  163.  216.  354.     35
## 7 87409900 65.7  121.   159.  179.  245.  498.     37
# plan_wide_19902020 %>% 
#    select(CODIGO, IQA) %>% 
#    group_by(CODIGO) %>% 
#    summarize(
#       min = 
#          min(IQA, 
#              na.rm = TRUE),
#       q1 = 
#          quantile(IQA, 0.25, 
#                   na.rm = TRUE),
#       median = 
#          median(IQA, 
#                 na.rm = TRUE),
#       mean = 
#          mean(IQA, 
#               na.rm= TRUE),
#       q3 = 
#          quantile(IQA, 0.75, 
#                   na.rm = TRUE),
#       max = 
#          max(IQA, 
#              na.rm = TRUE))

Time for this code chunk to run: 0.280925989151001

ggsave("cond_elet_p1.png",
       plot = cond_elet_p1,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 15 rows containing non-finite values (stat_boxplot).
## Removed 15 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 15 rows containing missing values (position_quasirandom).
ggsave("cond_elet_p2.png",
       plot = cond_elet_p2,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 37 rows containing non-finite values (stat_boxplot).
## Removed 37 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 37 rows containing missing values (position_quasirandom).
ggsave("cond_elet_p3.png",
       plot = cond_elet_p3,
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Saving 10 x 6.66 in image
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments
## Warning: Removed 25 rows containing non-finite values (stat_boxplot).
## Removed 25 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 25 rows containing missing values (position_quasirandom).
ggsave("cond_elet_3periodos.png",
       units = c("px"),
       width = 4500,
       height = 2993,
       plot = grid.arrange(cond_elet_p1, cond_elet_p2, cond_elet_p3, ncol = 3),
       path = "./graficos",
       dpi = 300,
       type = "cairo")
## Warning: Removed 15 rows containing non-finite values (stat_boxplot).
## Warning: Removed 15 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 15 rows containing missing values (position_quasirandom).
## Warning: Removed 37 rows containing non-finite values (stat_boxplot).
## Removed 37 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 37 rows containing missing values (position_quasirandom).
## Warning: Removed 25 rows containing non-finite values (stat_boxplot).
## Removed 25 rows containing non-finite values (stat_boxplot).
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 25 rows containing missing values (position_quasirandom).
## Warning: Using ragg device as default. Ignoring `type` and `antialias` arguments

Time for this code chunk to run: 7.15358209609985

LS0tDQp0aXRsZTogIlRDQyINCmF1dGhvcjogIkxlb25hcmRvIEZlcm5hbmRlcyBXaW5rIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQvJW0vJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgIGtlZXBfbWQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgICAgc21vb3RoX3Njcm9sbDogbm8NCiAgICBmaWdfd2lkdGg6IDEwDQogICAgZmlnX2hlaWdodDogNi42Ng0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBnaXRodWJfZG9jdW1lbnQ6DQogICAgaHRtbF9wcmV2aWV3OiB0cnVlDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQpmaWcuYWxpZ246IGNlbnRlcg0KLS0tDQoNCmBgYHtyIFJvdGluYSBwcmEgdG9kYSB2ZXogcXVlIGFicmlyIG8gZG9jdW1lbnRvLCBlY2hvID0gRkFMU0V9DQojIEFicmlyIG8gR2l0SHViIERlc2t0b3ANCiMgVmVyaWZpY2FyIHNlIGjDoSBwdWxsIHByYSBzZXIgZmVpdG8NCiMgQWJyaXIgbyBSU3R1ZGlvDQpgYGANCg0KIyBCcmllZiBleHBsYW5hdGlvbg0KDQpFdmVyeSBib3hwbG90IG1lYW5zIGEgbW9uaXRvcmluZyBwb2ludCAoUG9udG8gZGUgbW9uaXRvcmFtZW50byAob3IgUE0pIGluIHBvcnR1Z3Vlc2UpLiBNeSBnb2FsIGhlcmUgaXMgdG8gYW5hbHl6ZSB0aGUgZXZvbHV0aW9uIGJldHdlZW4gZGVjYWRlcyBvZiBlYWNoIHdhdGVyIHF1YWxpdHkgcGFyYW1ldGVyIHRoYXQgY29tcG91bmRzIHRoZSBXYXRlciBRdWFsaXR5IEluZGV4IChXUUkpLg0KDQpUaGUgcml2ZXIgZmxvd3MgaW4gdGhlIGVhc3Qtd2VzdCBkaXJlY3Rpb24gYXMgc2hvd24gaW4gdGhlIGltYWdlIGJlbG93Lg0KDQohW10oaW1hZ2VzL3Bhc3RlLTdBRDcwMjdGLnBuZykNCg0KVGhlIGxvZ2ljIGJlaGluZCB0aGUgc29ydGluZyBpbiB0aGUgYm94cGxvdHMgaXMgYmVjYXVzZSBvZiAyIG1haW4gcmVhc29uczoNCg0KMS4gIFRoZSBvcmlnaW5hbCBtb25pdG9yaW5nIHBvaW50IGlzbid0IGVhc3kgdG8gdW5kZXJzdGFuZCAoOCBkaWdpdHMsIGxpa2UgODc0MDk5MDApDQoyLiAgQ2hhbmdpbmcgdGhlIG9yaWdpbmFsIG5vbWVuY2xhdHVyZSB0byBQTTEsIFBNMiAoLi4uKSBtYWtlcyBpdCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB0aGF0IHRoZSBsYXN0IHBvaW50IGhhcyB3YXRlciBjb250cmlidXRpb25zIG9mIGV2ZXJ5IG90aGVyIHBvaW50IHVwc3RyZWFtLg0KDQpTb21lIGZlYXR1cmVzIHRoYXQgSSB3YW50IHRvIGFkZDoNCiogIElmIHRoZSBwYXJhbWV0ZXIgaXMgeCwgdGhlbiB1c2UgeCdzIGNsYXNzZXMgKHdpdGggaXRzIG93biBjbGFzc2VzIGJhY2tncm91bmQgY29sb3IgcGxvdHRlZCkNCiogIERlZmluZSB0aGUgdGltZXNjYWxlLCBzaG91bGQgYWN0IGp1c3QgbGlrZSBhIGZpbHRlcg0KDQpgYGB7ciBwMSBleGFtcGxlfQ0KIyBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMTk5MCIgJg0KIyAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIikNCmBgYA0KDQojIEFub3Rhw6fDtWVzIGRlIGNvaXNhcyBwb3IgZmF6ZXI6DQoNCi0gICBEZXNjb2JyaXIgY29tbyBjb2xvY2FyIGFzIGVzdGHDp8O1ZXMgbm8gc2VudGlkbyBjb3JyZXRvIG1vbnRhbnRlIC1cPiBqdXNhbnRlIG5vcyBzdW3DoXJpb3MNCg0KPiA4NzM5ODUwMCwgODczOTg5ODAsIDg3Mzk4OTAwLCA4NzM5ODk1MCwgODc0MDU1MDAsIDg3NDA2OTAwLCA4NzQwOTkwMA0KDQotICAgfn5BcHJlbmRlciBhIHNlZ21lbnRhciBvIG1ldSBkYXRhc2V0IHBvciBwZXLDrW9kb3N+fg0KLSAgIGFwcmVuZGVyIGEgY3JpYXIgdW1hIG5vdmEgY29sdW5hIGNvbSBhIHNlZ21lbnRhw6fDo28gZG9zIHBlcsOtb2Rvcw0KLSAgIG1heWJlIHVzZSBgfmZhY2V0LmdyaWRgDQotICAgYXByZW5kZXIgYSBjb2xvY2FyIGEgbGVnZW5kYSBkZW50cm8gZG8gZ3LDoWZpY28NCiAgICAtICAgcmVkdXppciBvIHRhbWFuaG8gZGEgbGVnZW5kYQ0KLSAgIH5+Y29ycmlnaXIgb3MgdmFsb3JlcyAwIGRlIElRQSBwcmEgTkF+fg0KLSAgIGRlc2NvYnJpciBjb21vIGNvbnNlZ3VpciBhIGVxdWHDp8OjbyBkbyBsbQ0KLSAgIH5+YXByZW5kZXIgYSBwaXZvdGFyIG8gc3Vtw6FyaW9+fiAtXD4gbWV1IHN1bcOhcmlvIGRvIGdvb2dsZSBkb2NzIHRhIGJhdGVuZG8gZGlyZWl0aW5obyBjb20gbyBkbyBSDQotICAgZGVzY29icmlyIHNlIGjDoSBvdXRyb3MgVENDcyBjb20gZGlzcG9uaWJpbGl6YcOnw6NvIGRlIGPDs2RpZ29zDQotICAgYE5hbW9uYCB0w6EgY29tIGNvbSBjYXNhIGRlY2ltYWwgYCIsImAgZSBgcHRvdGAgdMOhIGNvbSBgIi4iYA0KLSAgIGNvcnJlbGHDp8OjbyBmb3J0ZSBlbnRyZSBjb25kdXRpdmlkYWRlIGUgTmFtb24vUHRvdC9EQk8NCg0KfCAxOTkwLTIwMDAgfCAyMDAwLTIwMTAgfCAyMDEwLTIwMjAgfA0KfDotLS0tLS0tLS06fDotLS0tLS0tLS06fDotLS0tLS0tLS06fA0KfCAxOTkwLTIwMDAgfCAyMDAwLTIwMTAgfCAyMDEwLTIwMjAgfA0KDQojIEluc3RhbGFyIG9zIHBhY290ZXMNCg0KYGBge3IgaW5zdGFsYXIgcGFjb3Rlc30NCiMgaW5zdGFsbC5wYWNrYWdlcyh0aWR5dmVyc2UpDQpgYGANCg0KIyMgYWNlc3NhciBvcyBwYWNvdGVzDQoNCmBgYHtyIEFjZXNzYXIgb3MgcGFjb3RlcywgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gVFJVRX0NCiMgbGlicmFyeShyZWFkcikNCiMgbGlicmFyeShybWFya2Rvd24pDQojICMgbGlicmFyeShxYm94cGxvdCkNCiMgbGlicmFyeShyZWFkeGwpDQojIGxpYnJhcnkocGlsbGFyKQ0KIyBsaWJyYXJ5KGRwbHlyKQ0KIyBsaWJyYXJ5KHRpZHl2ZXJzZSkNCiMgbGlicmFyeShnYXBtaW5kZXIpDQojIGxpYnJhcnkoa25pdHIpDQojIGxpYnJhcnkoa2FibGVFeHRyYSkNCiMgbGlicmFyeShnZ3B1YnIpDQojIGxpYnJhcnkoZ3JpZEV4dHJhKQ0KIyBsaWJyYXJ5KG1vZGVsc3VtbWFyeSkNCiMgbGlicmFyeShndHN1bW1hcnkpDQojIGxpYnJhcnkoR0dhbGx5KQ0KcGFjbWFuOjpwX2xvYWQocmVhZHIsIHJtYXJrZG93biwgcmVhZHhsLA0KICAgICAgICAgICAgICAgcGlsbGFyLCBkcGx5ciwgdGlkeXZlcnNlLA0KICAgICAgICAgICAgICAgZ2FwbWluZGVyLCBrbml0ciwga2FibGVFeHRyYSwNCiAgICAgICAgICAgICAgIGdyaWRFeHRyYSwgI21vZGVsc3VtbWFyeSwgDQogICAgICAgICAgICAgICBndHN1bW1hcnksIGdncGxvdDIsDQogICAgICAgICAgICAgICBnZ2JlZXN3YXJtLCBHR2FsbHkpDQojIHBhY21hbjo6cF9sb2FkKHRpYmJsZXRpbWUpDQpgYGANCg0KYGBge3IgY3Jvbm9tZXRyYW5kbyBxdWFudG8gdGVtcG8gY2FkYSBjaHVuayBsZXZhfQ0Ka25pdHI6OmtuaXRfaG9va3Mkc2V0KHRpbWVfaXQgPSBsb2NhbCh7DQogIG5vdyA8LSBOVUxMDQogIGZ1bmN0aW9uKGJlZm9yZSwgb3B0aW9ucykgew0KICAgIGlmIChiZWZvcmUpIHsNCiAgICAgICMgcmVjb3JkIHRoZSBjdXJyZW50IHRpbWUgYmVmb3JlIGVhY2ggY2h1bmsNCiAgICAgIG5vdyA8PC0gU3lzLnRpbWUoKQ0KICAgIH0gZWxzZSB7DQogICAgICAjIGNhbGN1bGF0ZSB0aGUgdGltZSBkaWZmZXJlbmNlIGFmdGVyIGEgY2h1bmsNCiAgICAgIHJlcyA8LSBkaWZmdGltZShTeXMudGltZSgpLCBub3cpDQogICAgICAjIHJldHVybiBhIGNoYXJhY3RlciBzdHJpbmcgdG8gc2hvdyB0aGUgdGltZQ0KICAgICAgcGFzdGUoIlRpbWUgZm9yIHRoaXMgY29kZSBjaHVuayB0byBydW46IiwgcmVzKQ0KICAgIH0NCiAgfQ0KfSkpDQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldCh0aW1lX2l0ID0gVFJVRSkNCmBgYA0KDQojIyBpbXBvcnRhbmRvIGEgcGxhbmlsaGENCg0KYGBge3IgSW1wb3J0YW5kbyBhIHBsYW5pbGhhLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBUUlVFLCB3YXJuaW5nID0gRkFMU0V9DQpwbGFuX3dpZGVfMTk5MDIwMjAgPC0gcmVhZF9kZWxpbSgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2xlb25hcmRvZndpbmsvVENDX2doL21haW4vcGxhbl93aWRlXzE5OTAyMDIwLnRzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJcdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gY29scygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxjYWxpbmlkYWRlID0gY29sX2RvdWJsZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RJR08gPSBjb2xfY2hhcmFjdGVyKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT09SRF9HRU9fTEFUX0dSQVUgPSBjb2xfZG91YmxlKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPT1JEX0dFT19MT05HX0dSQVUgPSBjb2xfZG91YmxlKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfQ09MRVRBID0gY29sX2RhdGUoZm9ybWF0ID0gIiVkLyVtLyVZIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pdHJhdG8gPSBjb2xfZG91YmxlKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaXRyaXRvID0gY29sX2RvdWJsZSgpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFQgPSBjb2xfZG91YmxlKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1QgPSBjb2xfZG91YmxlKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBWYXphb2AgPSBjb2xfZG91YmxlKCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVmF6YW8gcmlvYCA9IGNvbF9kb3VibGUoKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZSgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uYW1lcyA9ICJwdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsX21hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nX21hcmsgPSAiIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW1fd3MgPSBUUlVFDQopDQoNCiMgdGVzdGVbficyMDAwJ10NCiMgDQojIHRlc3RlIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBkcGx5cjo6ZmlsdGVyKERBVEFfQ09MRVRBID49IGFzLlBPU0lYY3QoIjIwMTAtMDEtMDEiKSkgI3RoaXMgd29ya3MNCiMgDQojIHRlc3RlJERBVEFfQ09MRVRBIDwtIGFzLlBPU0lYY3QodGVzdGUkREFUQV9DT0xFVEEpDQojIA0KIyB0ZXN0ZSAlPiUgDQojICAgZHBseXI6OmFycmFuZ2UoREFUQV9DT0xFVEEpDQojIHRlc3RlICU+JSANCiMgICBmaWx0ZXJfdGltZSh0aW1lX2Zvcm11bGEgPSAnMjAxMy0wMS0wMScgfiAnMjAyMC0xMi0zMScpDQojIA0KIyANCiMgdHlwZW9mKHRlc3RlJERBVEFfQ09MRVRBKQ0KIyANCiMgICBhc190YmxfdGltZShwbGFuX3dpZGVfMTk5MDIwMjAsIGluZGV4ID0gREFUQV9DT0xFVEEpDQojIHN0cihwbGFuX3dpZGVfMTk5MDIwMjAkREFUQV9DT0xFVEEpDQpgYGANCg0KYGBge3IgVmlzdWFsaXphw6fDo28gZGEgcGxhbmlsaGEgaW1wb3J0YWRhLCBlY2hvID0gRkFMU0V9DQpwYWdlZF90YWJsZShwbGFuX3dpZGVfMTk5MDIwMjAsDQogICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHJvd3MucHJpbnQgPSAxNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29scy5wcmludCA9IDEwKSkNCmBgYA0KDQojIGRhdGEgd3JhbmdsaW5nDQoNCmBgYHtyIGRhdGEgd3JhbmdsaW5nfQ0KcGxhbl93aWRlXzE5OTAyMDIwIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogIG11dGF0ZShJUUEgPSBpZmVsc2UoSVFBID09IDAsIE5BLCBJUUEpKQ0KYGBgDQoNCmBgYHtyIEPDs2RpZ29zIEdpdCwgZWNobyA9IEZBTFNFfQ0KIyBjZCBteXJlcG8NCiMgbHMNCiMgaGVhZCBSRUFETUUubWQNCiMgZ2l0IHN0YXR1cw0KIyBnaXQgYWRkIFJFQURNRS5tZA0KIyBnaXQgY29tbWl0IC1tICJBIGNvbW1pdCBmcm9tIG15IGxvY2FsIGNvbXB1dGVyIg0KIyANCiMgY2QgLi4gIyB2b2x0YXIgcHJvIGRpcmV0w7NyaW8gYWNpbWENCiMgcm0gLXJmIG15cmVwby8gI3JlbW92ZXIvYXBhZ2FyIGEgcGFzdGEgbXlyZXBvDQpgYGANCg0KYGBge3IgQXByZW5kZW5kbyBHaXQsIGVjaG8gPSBGQUxTRX0NCiMgc2xpZGVzIGRhIGJpYSBxdWUgYWp1ZGFtIG10DQojIGh0dHBzOi8vYmVhdHJpem1pbHouZ2l0aHViLmlvL3NsaWRlc1IvZ2l0X3JzdHVkaW8vMTEtMjAyMS1FTkNFLmh0bWwjMjANCiMgYXByZW5kZW5kbyBhIHNpbmNyb25pemFyIHVzYW5kbyBlc3NlIGd1aWEgLT4gDQojIGh0dHBzOi8vaGFwcHlnaXR3aXRoci1jb20udHJhbnNsYXRlLmdvb2cvcHVzaC1wdWxsLWdpdGh1Yi5odG1sP194X3RyX3NsPWF1dG8mX3hfdHJfdGw9cHQmX3hfdHJfaGw9cHQtQlINCiMgbGlicmFyeSh1c2V0aGlzKQ0KIyB1c2V0aGlzOjpjcmVhdGVfZ2l0aHViX3Rva2VuKCkgY3JpYXIgdW0gY8OzZGlnbyBwcmEgYWNlc3NvIGUgc2luY3Jvbml6YcOnw6NvIGJldHdlZW4gUiBlIGdpdGh1Yg0KDQojIGdpdGNyZWRzOjpnaXRjcmVkc19zZXQoKSANCiMgDQojIHVzZV9naXRfY29uZmlnKHVzZXIubmFtZSA9ICJsZW9uYXJkb2Z3aW5rIiwNCiMgICAgICAgICAgICAgICAgdXNlci5lbWFpbCA9ICJsZW9uYXJkb2Z3aW5rQGdtYWlsLmNvbSIpDQojIHVzZXRoaXM6OmdoX3Rva2VuX2hlbHAoKQ0KDQojIENvbW8gbW9zdHJhciBvcyBkYWRvcyBkZSB1bSBhcnF1aXZvIHZpYSBHaXQvR2l0SHViDQojIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vbGVvbmFyZG9md2luay9teXJlcG8uZ2l0DQojIGNkIG15cmVwbyAjYWNlc3NhIGEgcGFzdGEgbXlyZXBvDQojIGxzICNsaXN0YSBvcyBhcnF1aXZvcyBkYSBwYXN0YSANCiMgaGVhZCBSRUFETUUubWQgI21vc3RyYSBhcyBwcmltZWlyYXMgb2JzZXJ2YcOnw7VlcyBkbyBhcnF1aXZvDQoNCiMgQ29tbyBtb3N0cmFyIG9zIGRhZG9zIGRlIHVtIGFycXVpdm8gdmlhIFINCiMgaGVhZChDOi9Vc2Vycy9Mw6lvL215cmVwby9SRUFETUUubWQpDQoNCiMgQWRpY2lvbmFyIHVtYSBsaW5oYSBhbyBSRUFETUUubWQgZSB2ZXJpZmljYXIgc2UgbyBHaXQgcGVyY2ViZSBhIG11ZGFuw6dhDQojIGVjaG8gIkEgbGluZSBJIHdyb3RlIG9uIG15IGxvY2FsIGNvbXB1dGVyIiA+PiBSRUFETUUubWQNCiMgZ2l0IHN0YXR1cw0KIyMgQzpcVXNlcnNcTMOpb1xteXJlcG8+Z2l0IHN0YXR1cw0KIyMgT24gYnJhbmNoIG1haW4NCiMjIFlvdXIgYnJhbmNoIGlzIHVwIHRvIGRhdGUgd2l0aCAnb3JpZ2luL21haW4nLg0KIyMgDQojIyBDaGFuZ2VzIG5vdCBzdGFnZWQgZm9yIGNvbW1pdDoNCiMjICAgKHVzZSAiZ2l0IGFkZCA8ZmlsZT4uLi4iIHRvIHVwZGF0ZSB3aGF0IHdpbGwgYmUgY29tbWl0dGVkKQ0KIyMgICAodXNlICJnaXQgcmVzdG9yZSA8ZmlsZT4uLi4iIHRvIGRpc2NhcmQgY2hhbmdlcyBpbiB3b3JraW5nIGRpcmVjdG9yeSkNCiMjICAgICAgICAgKiptb2RpZmllZDogICBSRUFETUUubWQqKg0KIyMgDQojIyBubyBjaGFuZ2VzIGFkZGVkIHRvIGNvbW1pdCAodXNlICJnaXQgYWRkIiBhbmQvb3IgImdpdCBjb21taXQgLWEiKQ0KYGBgDQoNCiMgc2V0dGluZyB0aGVtZQ0KDQpgYGB7ciBzZXR0aW5nIHRoZW1lfQ0KdGhlbWVfZ3JhZnMgPC0gZnVuY3Rpb24oYmcgPSAid2hpdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yYWNhb19sZXRyYSA9ICJibGFjayIpIHsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgY29sb3IgPSBjb2xvcmFjYW9fbGV0cmEsDQogICAgICBzaXplID0gMTkpLA0KICAgIA0KICAgIGF4aXMudGl0bGUueCA9IA0KICAgICAgIyBlbGVtZW50X3RleHQoDQogICAgICAjIGNvbG9yID0gY29sb3JhY2FvX2xldHJhLA0KICAgICAgIyBzaXplID0gMTUsDQogICAgICAjIGFuZ2xlID0gMCwpLA0KICAgICAgZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGNvbG9yID0gY29sb3JhY2FvX2xldHJhLA0KICAgICAgc2l6ZSA9IDE1LA0KICAgICAgYW5nbGUgPSA5MCksDQogICAgDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoDQogICAgICBjb2xvciA9IGNvbG9yYWNhb19sZXRyYSwNCiAgICAgIHNpemUgPSAxNyksDQogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICBjb2xvciA9IGNvbG9yYWNhb19sZXRyYSwNCiAgICAgIHNpemUgPSAxNywNCiAgICAgIGFuZ2xlID0gMCksDQogICAgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gYmcpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gYmcpLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKGwgPSA1LCByID0gMTAsDQogICAgICAgICAgICAgICAgICAgICAgICAgYiA9IDUsIHQgPSA1KQ0KICApDQp9DQpgYGANCg0KIyBzZXR0aW5nIGRpZmZlcmVudCB0aW1lc2NhbGVzDQoNCmBgYHtyIHNldHRpbmcgcGVyaW9kb3MsIGVjaG8gPSBGQUxTRX0NCiMgcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiMgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQojICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAwMCIpDQojIA0KIyBwMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjIwMDAiICYNCiMgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDEwIikNCiMgDQojIHAzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQojICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMjAxMCIgJg0KIyAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMjAiKQ0KDQojIHRlc3RlX2FsbF9wZXJpb2RvcyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgIGZpbHRlcigNCiMgICAgIGJldHdlZW4oQU5PX0NPTEVUQSwgMTk5MCwgMjAwMCkNCiMgICApDQpgYGANCg0KIyBzZXR0aW5nIHN1bWFyaWVzDQoNCmBgYHtyIFN1bcOhcmlvcywgZWNobyA9IEZBTFNFfQ0KIyBwMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjE5OTAiICYNCiMgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIikNCiMgDQojIHAyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDAwIiAmDQojICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMTAiKQ0KIyANCiMgcDMgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KIyAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjIwMTAiICYNCiMgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAyMCIpDQoNCiAgIyBwZXJpb2RvID0gYyhwMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAjICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMTk5MCIgJg0KICAjICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAwMCIpLA0KICAjIA0KICAjIHAyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgIyAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjIwMDAiICYNCiAgIyAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMTAiKSwNCiAgIyANCiAgIyBwMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICMgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDEwIiAmDQogICMgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDIwIikpDQoNCiMgc3VtYXJpbyA8LSBmdW5jdGlvbihwYXJhbWV0cm9zID0gcGFyYW1ldHJvcywgcGVyaW9kbyl7DQojICAgcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KIyAgICBzZWxlY3QoQ09ESUdPLCAuLCBBTk9fQ09MRVRBKSAlPiUgDQojICAgICMgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiMgICAgIyAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpICU+JSANCiMgICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQojICAgIHN1bW1hcml6ZSgNCiMgICAgICBtaW4gPSANCiMgICAgICAgIG1pbihwYXJhbWV0cm9zLCANCiMgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgIHExID0gDQojICAgICAgICBxdWFudGlsZShwYXJhbWV0cm9zLCAwLjI1LCANCiMgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgbWVkaWFuID0gDQojICAgICAgICBtZWRpYW4ocGFyYW1ldHJvcywgDQojICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICBtZWFuID0gDQojICAgICAgICBtZWFuKHBhcmFtZXRyb3MsIA0KIyAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQojICAgICAgcTMgPSANCiMgICAgICAgIHF1YW50aWxlKHBhcmFtZXRyb3MsIDAuNzUsIA0KIyAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICBtYXggPSANCiMgICAgICAgIG1heChwYXJhbWV0cm9zLCANCiMgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KIyB9DQoNCiMgcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiMgICBzdW1hcmlvKHBhcmFtZXRyb3MgPSBEQk8pDQoNCiMgc3VtX0lRQV9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgIHNlbGVjdChDT0RJR08sIElRQSwgQU5PX0NPTEVUQSkgJT4lIA0KIyAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KIyAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpICU+JSANCiMgICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQojICAgIHN1bW1hcml6ZSgNCiMgICAgICBtaW4gPSANCiMgICAgICAgIG1pbihJUUEsIA0KIyAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgcTEgPSANCiMgICAgICAgIHF1YW50aWxlKElRQSwgMC4yNSwgDQojICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgIG1lZGlhbiA9IA0KIyAgICAgICAgbWVkaWFuKElRQSwgDQojICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICBtZWFuID0gDQojICAgICAgICBtZWFuKElRQSwgDQojICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiMgICAgICBxMyA9IA0KIyAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjc1LCANCiMgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQojICAgICAgbWF4ID0gDQojICAgICAgICBtYXgoSVFBLCANCiMgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCiMgUGFyw6JtZXRyb3MgZsOtc2ljby1xdcOtbWljb3MNCg0KIyMjIE94aWfDqm5pbyBEaXNzb2x2aWRvDQoNCmBgYHtyIHNldHRpbmcgYmFzZSBvZH0NCiMgcGFyX29kIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBzZWxlY3QoQ09ESUdPLCBgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gKSAlPiUNCiMgICBncm91cF9uZXN0KENPRElHTykNCg0KIyBkYXRhICU+JSAgbyBxdWUgbyBQYXQgZmV6IG5vIENDMTU2IDIxbWluNTZzDQojICAgaGlnaGxpZ2h0X2tleSguLCB+KSAlPiUgDQojICAgZ2dwbG90KCkNCiMgb3hpZ19wMSA8LSBwMSAlPiUgDQojICAgc2VsZWN0KENPRElHTywgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCkNCiMgDQojIHBhcl9vZCA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgIHNlbGVjdChDT0RJR08sICkgJT4lIA0KIyAgIGdyb3VwX2J5KENPRElHTykNCg0KIyBwYXJhbWV0cm9zX0lRQQ0KDQojIHBhcmFtZXRyb3MgPC0gY29sbmFtZXMocGFyYW1ldHJvc19JUUEpDQoNCiMgYmFzZV9vZCA8LSBmdW5jdGlvbih0aXR1bG8gPSAiVMOtdHVsbyIpIHsNCiMgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQojICAgICAgICAgICAgeW1pbiA9IC1JbmYsIHltYXggPSAyLA0KIyAgICAgICAgICAgIGFscGhhID0gMSwNCiMgICAgICAgICAgICBmaWxsID0gIiNhYzUwNzkiKSsgIyA+cGlvciBjbGFzc2UNCiMgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KIyAgICAgICAgICAgICAgeW1pbiA9IDIsIHltYXggPSA0LA0KIyAgICAgICAgICAgICAgYWxwaGEgPSAxLA0KIyAgICAgICAgICAgICAgZmlsbCA9ICIjZWI1NjYxIikrICNjbGFzc2UgNA0KIyAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQojICAgICAgICAgICAgICB5bWluID0gNCwgeW1heCA9IDUsDQojICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiMgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgIHhtaW49LUluZiwNCiMgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgeW1pbj01LA0KIyAgICAgICAgICAgICAgeW1heD02LA0KIyAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQojICAgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgIHltaW49NiwNCiMgICAgICAgICAgICAgIHltYXg9SW5mLA0KIyAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQojICAgICBzdGF0X2JveHBsb3QoDQojICAgICAgIGdlb20gPSAnZXJyb3JiYXInLA0KIyAgICAgICB3aWR0aD0wLjMsDQojICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KQ0KIyAgICAgKSsNCiMgICAgIGxhYnMoDQojICAgICAgIHRpdGxlID0gdGl0dWxvLA0KIyAgICAgICB4ID0gIkVzdGHDp8OjbyIsDQojICAgICAgIHkgPSAibWcvTCINCiMgICAgICkrDQojICAgICBnZW9tX3F1YXNpcmFuZG9tKA0KIyAgICAgICBzaXplID0gMS4yLA0KIyAgICAgICBhbHBoYSA9IC4yNSwNCiMgICAgICAgd2lkdGggPSAuMDcsDQojICAgICApKw0KIyAgICAgc2NhbGVfeV9jb250aW51b3VzKA0KIyAgICAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQojICAgICAgIG4uYnJlYWtzID0gMTEsDQojICAgICAgIGxpbWl0cyA9IGMoLTEsMjEpDQojICAgICApKw0KIyAgICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KIyAgICAgKSsNCiMgICAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQojICAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiMgICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiMgICAgICAgICAgICAgICAgIGFscGhhPS41LA0KIyAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KIyAgICAgICAgICAgICAgICAgc2l6ZSA9IDEpDQojIH0NCg0KIyBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgZ2dwbG90KA0KIyAgICAgYWVzKENPRElHTywgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCkNCiMgICApKw0KIyAgIGdlb21fYm94cGxvdCgNCiMgICAgICAgZmlsbCA9ICcjRjhGOEZGJywNCiMgICAgICAgY29sb3IgPSAiYmxhY2siLA0KIyAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiMgICAgICAgd2lkdGg9IDAuNw0KIyAgICAgKSsNCiMgICBiYXNlX29kKCJPeGlnw6puaW8gMTk5MCIpDQogIA0KDQpgYGANCg0KYGBge3IgR3LDoWZpY28gT0QgcGVyaW9kbyAxLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLmNhcD0iT3hpZ8OqbmlvIERpc3NvbHZpZG8gbm8gcGVyw61vZG8gMTk5MC0yMDAwIn0NCihvZF9wMSA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAwMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCkNCikrDQogIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgeG1pbiA9IC1JbmYsIHhtYXggPSBJbmYsDQogICAgICAgICAgIHltaW4gPSAtSW5mLCB5bWF4ID0gMiwNCiAgICAgICAgICAgYWxwaGEgPSAxLA0KICAgICAgICAgICBmaWxsID0gIiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICB5bWluID0gMiwgeW1heCA9IDQsDQogICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgZmlsbCA9ICIjZWI1NjYxIikrICNjbGFzc2UgNA0KICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICB5bWluID0gNCwgeW1heCA9IDUsDQogICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgZmlsbCA9ICIjZmNmN2FiIikrICNjbGFzc2UgMw0KICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICB5bWluID0gNSwgeW1heCA9IDYsDQogICAgICAgICAgIGFscGhhID0gMSwNCiAgICAgICAgICAgZmlsbCA9ICIjNzBjMThjIikrICNjbGFzc2UgMg0KICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgIHhtaW4gPSAtSW5mLCB4bWF4ID0gSW5mLA0KICAgICAgICAgICB5bWluPSA2LCB5bWF4ID0gSW5mLA0KICAgICAgICAgICBhbHBoYSA9IDEsDQogICAgICAgICAgIGZpbGwgPSAiIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgc3RhdF9ib3hwbG90KA0KICAgIGdlb20gPSAnZXJyb3JiYXInLA0KICAgIHdpZHRoID0gMC4zLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KQ0KICApKw0KICBnZW9tX2JveHBsb3QoDQogICAgZmlsbCA9ICcjRjhGOEZGJywNCiAgICBjb2xvciA9ICJibGFjayIsDQogICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgd2lkdGggPSAwLjcNCiAgKSsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgIHg9IkVzdGHDp8OjbyIsDQogICAgeT0ibWcvTCINCiAgKSsNCiAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICBzaXplID0gMS4yLA0KICAgIGFscGhhID0gLjI1LA0KICAgIHdpZHRoID0gLjA3LA0KICApKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoDQogICAgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgIG4uYnJlYWtzID0gMTEsDQogICAgbGltaXRzID0gYygtMSwyMSkNCiAgKSsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA1NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwOTkwMCIpLA0KICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQogICkrDQogIGdlb21fc21vb3RoKA0KICAgIG1ldGhvZCA9ICJsbSIsDQogICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgYWVzKGdyb3VwID0gMSksDQogICAgYWxwaGEgPSAuNSwNCiAgICBuYS5ybSA9IFRSVUUsDQogICAgc2l6ZSA9IDENCiAgKSsNCiAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIE9EIHBlcmlvZG8gMiwgZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoob2RfcDIgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgIGBPeGlnw6puaW8gZGlzc29sdmlkb2ApKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0yLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTIsDQogICAgICAgICAgICB5bWF4PTQsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj00LA0KICAgICAgICAgICAgeW1heD01LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NSwNCiAgICAgICAgICAgIHltYXg9NiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTYsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIk94aWfDqm5pbyBEaXNzb2x2aWRvIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9TlVMTCkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgIG4uYnJlYWtzID0gMTEsDQogICAgIGxpbWl0cyA9IGMoLTEsMjEpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aCgNCiAgICAgbWV0aG9kID0gImxtIiwNCiAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgIGFlcyhncm91cD0xKSwNCiAgICAgYWxwaGE9LjUsDQogICAgIG5hLnJtID0gVFJVRSwNCiAgICAgc2l6ZSA9IDENCiAgICkrDQogIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBPRCBwZXJpb2RvIDMsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKG9kX3AzIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICBgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0yLA0KICAgICAgICAgICAgeW1heD00LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NCwNCiAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUsDQogICAgICAgICAgICB5bWF4PTYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj02LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PU5VTEwsDQogICAgICAgIHk9TlVMTCkrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgICBleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgIG4uYnJlYWtzID0gMTEsDQogICAgIGxpbWl0cyA9IGMoLTEsMjEpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDY5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgICkrDQogICBnZW9tX3Ntb290aCgNCiAgICAgbWV0aG9kID0gImxtIiwNCiAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgIGFlcyhncm91cD0xKSwNCiAgICAgYWxwaGE9LjUsDQogICAgIG5hLnJtID0gVFJVRSwNCiAgICAgc2l6ZSA9IDENCiAgICkrDQogIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBPRCAzIHBlcmlvZG9zIGp1bnRvcywgZWNobyA9IFRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLmNhcD0iT3hpZ8OqbmlvIERpc3NvbHZpZG8gbm8gcGVyw61vZG8gMTk5MC0yMDIwIn0NCmdyaWQuYXJyYW5nZShvZF9wMSwgb2RfcDIsIG9kX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBPRH0NCmdnc2F2ZSgib2RfcDEucG5nIiwNCiAgICAgICBwbG90ID0gb2RfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgib2RfcDIucG5nIiwNCiAgICAgICBwbG90ID0gb2RfcDIsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgib2RfcDMucG5nIiwNCiAgICAgICBwbG90ID0gb2RfcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgib2RfM3BlcmlvZG9zXzIucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShvZF9wMSwgb2RfcDIsIG9kX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KYGBge3IgR3LDoWZpY28gT0RfY2hlcm5vYnlsLCBlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCiMgcDEgPC0gZnVuY3Rpb24ocGxhbl93aWRlXzE5OTAyMDIwLCBBTk9fQ09MRVRBKSB7DQojICAgcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiMgICAgIGZpbHRlcihBTk9fQ09MRVRBID4gIjE5OTAiICYNCiMgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIikNCiMgfQ0KIyANCiMgDQojIGNsYXNzZXNfb2QgPC0gZnVuY3Rpb24ocGxhbl93aWRlXzE5OTAyMDIwLCBwYXJhbWV0cm8sIHBlcmlvZG8pew0KIyAgIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgICAgICAgICAgcGVyaW9kbyksDQojICAgYWVzKENPRElHTywNCiMgICAgICAgcGFyYW1ldHJvKQ0KIyB9DQoNCg0KIyAob2RfY2hlcm5vYnlsIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgcDEoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gKSkrDQojICAgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgIHltaW49LUluZiwNCiMgICAgICAgICAgICAgIHltYXg9MiwNCiMgICAgICAgICAgICAgIGFscGhhPTEsDQojICAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiMgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgIHhtaW49LUluZiwNCiMgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgeW1pbj0yLA0KIyAgICAgICAgICAgICAgeW1heD00LA0KIyAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQojICAgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICB4bWF4PUluZiwNCiMgICAgICAgICAgICAgIHltaW49NCwNCiMgICAgICAgICAgICAgIHltYXg9NSwNCiMgICAgICAgICAgICAgIGFscGhhPTEsDQojICAgICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KIyAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgeG1pbj0tSW5mLA0KIyAgICAgICAgICAgICAgeG1heD1JbmYsDQojICAgICAgICAgICAgICB5bWluPTUsDQojICAgICAgICAgICAgICB5bWF4PTYsDQojICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiMgICAgIGFubm90YXRlKCJyZWN0IiwNCiMgICAgICAgICAgICAgIHhtaW49LUluZiwNCiMgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgeW1pbj02LA0KIyAgICAgICAgICAgICAgeW1heD1JbmYsDQojICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiMgICAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiMgICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQojICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiMgICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiMgICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KIyAgICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KIyAgICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KIyAgICAgbGFicyh0aXRsZSA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KIyAgICAgICAgICB4PSJFc3Rhw6fDo28iLA0KIyAgICAgICAgICB5PSJtZy9MIikrDQojICAgICAjIGdlb21faml0dGVyKHdpZHRoID0gLjA3LA0KIyAgICAgIyAgICAgICAgICAgICBhbHBoYT0uMTUsDQojICAgICAjICAgICAgICAgICAgIHNpemU9MS4sDQojICAgICAjICAgICAgICAgICAgIGNvbG9yPSJibGFjayIpKw0KIyAgICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiMgICAgICAgc2l6ZSA9IDEuMiwNCiMgICAgICAgYWxwaGEgPSAuMjUsDQojICAgICAgIHdpZHRoID0gLjA3LA0KIyAgICAgKSsNCiMgICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQojICAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSAxMSwNCiMgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDIxKSkrDQojICAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBNMSIsICJQTTIiLCAiUE0zIiwgIlBNNCIsICJQTTUiLCAiUE02IiwgIlBNNyIpDQojICAgICApKw0KIyAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiMgICAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KIyAgICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KIyAgICAgICAgICAgICAgICAgYWxwaGE9LjUsDQojICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQojICAgICAgICAgICAgICAgICBzaXplID0gMSkrDQojICAgICAjIGdlb21fbGluZSgNCiMgICAgICMgICBhZXMoY29sb3I9InJlZCIpLA0KIyAgICAgIyAgIGFscGhhPS4wKSsNCiMgICAgICMgc2NhbGVfY29sb3JfbWFudWFsKCJMZWdlbmRhIiwNCiMgICAgICMgICAgICAgICAgICAgICAgICAgIGd1aWRlPSJsZWdlbmQiLA0KIyAgICAgIyAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQ2xhc3NlIDEiPSIjOGRjZGViIiwNCiMgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSAyIj0iIzcwYzE4YyIsDQojICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzc2UgMyI9IiNmY2Y3YWIiLA0KIyAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xhc3NlIDQiPSIjZWI1NjYxIiwNCiMgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpb3IgQ2xhc3NlIj0iI2FjNTA3OSIpKSsNCiMgICAgICMgZ3VpZGVzKGNvbG9yPWd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGxpbmV0eXBlPWMoMSwxLDEsMSwxKSwNCiMgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsd2Q9YygyLDIsMiwyLDIpLA0KIyAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXBlPWMoTkEsTkEsTkEsTkEsTkEpLA0KIyAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhPTEpKSkrDQojICAgdGhlbWUoDQojICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOSksDQojICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiMgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNyksDQojICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTcpLA0KIyAgICkNCiMgKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIElRQSBPRCBwZXJpb2RvMSwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KKGlxYW9kX3AxIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDAwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgSVFBX09ELCBuYS5ybSA9IFRSVUUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBwYXJhIG8gcGFyw6JtZXRybyBPeGlnw6puaW8gRGlzc29sdmlkbyAxOTkwLTIwMDAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICApKw0KICBnZW9tX3Ntb290aCgNCiAgICBtZXRob2QgPSAibG0iLA0KICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgIGFlcyhncm91cD0xKSwNCiAgICBhbHBoYT0uNSwNCiAgICBuYS5ybSA9IFRSVUUsDQogICAgc2l6ZSA9IDENCiAgKSsNCiAgdGhlbWVfZ3JhZnMoKQ0KICkNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgT0QgcGVyaW9kbzIsIGVjaG8gPSBGQUxTRSwgd2FybmluZz0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihpcWFvZF9wMiA8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgIElRQV9PRCwgbmEucm0gPSBUUlVFKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICB5bWF4PTM2LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MzYsDQogICAgICAgICAgICB5bWF4PTUxLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTEsDQogICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgcGFyYSBvIHBhcsOibWV0cm8gT3hpZ8OqbmlvIERpc3NvbHZpZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDYsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMSwxMDEpKSsNCiAgICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDU1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNjkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA5OTAwIiksDQogICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUE0xIiwgIlBNMiIsICJQTTMiLCAiUE00IiwgIlBNNSIsICJQTTYiLCAiUE03IikNCiAgKSsNCiAgZ2VvbV9zbW9vdGgoDQogICAgbWV0aG9kID0gImxtIiwNCiAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICBhZXMoZ3JvdXA9MSksDQogICAgYWxwaGE9LjUsDQogICAgbmEucm0gPSBUUlVFLA0KICAgIHNpemUgPSAxDQogICkrDQogIHRoZW1lX2dyYWZzKCkNCiApDQoNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgT0QgcGVyaW9kbzMsIGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGlxYW9kX3AzIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBIDw9ICIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgSVFBX09ELCBuYS5ybSA9IFRSVUUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBwYXJhIG8gcGFyw6JtZXRybyBPeGlnw6puaW8gRGlzc29sdmlkbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3NDA2OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODc0MDk5MDAiKSwNCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQTTEiLCAiUE0yIiwgIlBNMyIsICJQTTQiLCAiUE01IiwgIlBNNiIsICJQTTciKQ0KICApKw0KICBnZW9tX3Ntb290aCgNCiAgICBtZXRob2QgPSAibG0iLA0KICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgIGFlcyhncm91cD0xKSwNCiAgICBhbHBoYT0uNSwNCiAgICBuYS5ybSA9IFRSVUUsDQogICAgc2l6ZSA9IDENCiAgKSsNCiAgdGhlbWVfZ3JhZnMoKQ0KICkNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBPRF9JUUEgNiBwZXJpb2RvcyBqdW50b3MsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpncmlkLmFycmFuZ2UoaXFhb2RfcDEsIGlxYW9kX3AyLCBpcWFvZF9wMywgbmNvbCA9IDMpDQpgYGANCg0KYGBge3IgU3Vtw6FyaW8gT0QsIGVjaG8gPSBGQUxTRX0NCihzdW1fb2RfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KENPRElHTywgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybSA9IFRSVUUpLA0KICAgICBxMSA9IA0KICAgICAgIHF1YW50aWxlKGBPeGlnw6puaW8gZGlzc29sdmlkb2AsIDAuMjUsIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWFuID0gDQogICAgICAgbWVhbihgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybT0gVFJVRSksDQogICAgIHEzID0gDQogICAgICAgcXVhbnRpbGUoYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgMC43NSwgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KGBPeGlnw6puaW8gZGlzc29sdmlkb2AsIG5hLnJtID0gVFJVRSksDQogICAgIG4gPSANCiAgICAgICAgbGVuZ3RoKGBPeGlnw6puaW8gZGlzc29sdmlkb2ApDQogICApICU+JSANCiAgcGl2b3RfbG9uZ2VyKA0KICAgICFDT0RJR08sDQogICAgbmFtZXNfdG8gPSAicGFyIiwNCiAgICB2YWx1ZXNfdG8gPSAidmFsb3IiDQogICkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gQ09ESUdPLA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHZhbG9yKQ0KKQ0KDQooc3VtX29kX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgc2VsZWN0KENPRElHTywgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgQU5PX0NPTEVUQSkgJT4lIA0KICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpICU+JSANCiAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogIHN1bW1hcml6ZSgNCiAgICBtaW4gPSANCiAgICAgIG1pbihgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybSA9IFRSVUUpLA0KICAgIHExID0gDQogICAgICBxdWFudGlsZShgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhbiA9IA0KICAgICAgbWVkaWFuKGBPeGlnw6puaW8gZGlzc29sdmlkb2AsIG5hLnJtID0gVFJVRSksDQogICAgbWVhbiA9IA0KICAgICAgbWVhbihgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybT0gVFJVRSksDQogICAgcTMgPSANCiAgICAgIHF1YW50aWxlKGBPeGlnw6puaW8gZGlzc29sdmlkb2AsIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgbWF4ID0gDQogICAgICBtYXgoYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgbmEucm0gPSBUUlVFKQ0KICAgICkNCikNCg0KKHN1bV9vZF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgMC4yNSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCAwLjc1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBuYS5ybSA9IFRSVUUpDQogICAgKQ0KKQ0KDQojIHN1bWFyaW9fT0QzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICBzZWxlY3QoREFUQV9DT0xFVEEsIENPRElHTywgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCkgJT4lIA0KIyAgIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBEQVRBX0NPTEVUQSwNCiMgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gQ09ESUdPLA0KIyAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gcGxhbl93aWRlXzE5OTAyMDIwJGBPeGlnw6puaW8gZGlzc29sdmlkb2ApDQojIA0KIyB1bmlxdWUocGxhbl93aWRlXzE5OTAyMDIwJENPRElHTykNCg0KIyANCiMgICBwaXZvdF93aWRlcihpZF9jb2xzID0gQ09ESUdPLA0KIyAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBDT0RJR08sDQojICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gKQ0KIyANCiMgDQojICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUNCiMgICBnZXRfc3VtbWFyeV9zdGF0cyh0eXBlID0gImNvbW1vbiIpICU+JQ0KIyAgIHBpdm90X3dpZGVyKGlkX2NvbHMgPSB2YXJpYWJsZSwNCiMgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gQ09ESUdPLA0KIyAgICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gdmFyaWFibGUkYE94aWfDqm5pbyBkaXNzb2x2aWRvYCkNCiMgDQojICMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwdWJyIikNCiMgIyBsaWJyYXJ5KGdncHVicikNCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMjIyBEZW1hbmRhIEJpb3F1w61taWNhIGRlIE94aWfDqm5pbw0KDQpgYGB7ciBHcsOhZmljbyBEQk8gcGVyw61vZG8xLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGRib19wMTwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICBEQk8pKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUsDQogICAgICAgICAgICB5bWF4PTEwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MywNCiAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJEZW1hbmRhIEJpb3F1w61taWNhIGRlIE94aWfDqm5pbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJtZy9MIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLDEwMCksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBEQk8gcGVyw61vZG8yLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGRib19wMjwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICBEQk8pKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUsDQogICAgICAgICAgICB5bWF4PTEwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MywNCiAgICAgICAgICAgIHltYXg9NSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJEZW1hbmRhIEJpb3F1w61taWNhIGRlIE94aWfDqm5pbyBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJtZy9MIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLDEwMCksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gREJPIHBlcsOtb2RvMywgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihkYm9fcDM8LWdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgREJPLCBuYS5ybT1UUlVFKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01LA0KICAgICAgICAgICAgeW1heD0xMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTMsDQogICAgICAgICAgICB5bWF4PTUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0zLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiRGVtYW5kYSBCaW9xdcOtbWljYSBkZSBPeGlnw6puaW8gbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMywwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwxMDApLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIikrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIERCTyBwZXJpb2RvMSwgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihpcWFfZGJvMTwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIiksDQogICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgIElRQV9EQk8pKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxKSkNCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgcGFyYSBvIHBhcsOibWV0cm8gREJPIDE5OTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Im1nL0wiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgREJPIHBlcmlvZG8yLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGlxYV9kYm8yPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwJT4lIA0KICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICBJUUFfREJPKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICB5bWF4PTM2LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MzYsDQogICAgICAgICAgICB5bWF4PTUxLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTEsDQogICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMSkpDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIlZhcmlhw6fDo28gZG8gSVFBIHBhcmEgbyBwYXLDom1ldHJvIERCTyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJtZy9MIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDYsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMSwxMDEpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCAiODczOTg5NTAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIHRoZW1lX2dyYWZzKCkNCiApDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIERCTyBwZXJpb2RvMywgZWNobyA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihpcWFfZGJvMzwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCU+JSANCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgSVFBX0RCTykpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTE5LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTE5LA0KICAgICAgICAgICAgeW1heD0zNiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTM2LA0KICAgICAgICAgICAgeW1heD01MSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUxLA0KICAgICAgICAgICAgeW1heD03OSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTc5LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDEpKQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBwYXJhIG8gcGFyw6JtZXRybyBEQk8gMjAxMC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwwKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMTAxKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwgIjg3Mzk4OTUwIiwgIjg3NDA1NTAwIiwgIjg3NDA2OTAwIiwgIjg3NDA5OTAwIikpKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogdGhlbWVfZ3JhZnMoKQ0KICkNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBEQk8gMyBwZXJpb2RvcyBqdW50b3MsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpncmlkLmFycmFuZ2UoZGJvX3AxLCBkYm9fcDIsIGRib19wMywgbmNvbCA9IDMpDQpgYGANCg0KYGBge3IgU3Vtw6FyaW8gREJPfQ0KKHN1bV9kYm9fcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KENPRElHTywgREJPLCBBTk9fQ09MRVRBKSAlPiUgDQogICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShDT0RJR08pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKERCTywgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUoREJPLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oREJPLCANCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oREJPLCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShEQk8sIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChEQk8sIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Rib19wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgREJPLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpICU+JSANCiAgICBncm91cF9ieShDT0RJR08pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKERCTywgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoREJPLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oREJPLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oREJPLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShEQk8sIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChEQk8sIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9kYm9fcDMgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIERCTywgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihEQk8sIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKERCTywgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKERCTywgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKERCTywgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoREJPLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoREJPLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQpgYGANCg0KYGBge3IgU2FsdmFuZG8gREJPfQ0KZ2dzYXZlKCJkYm9fcDEucG5nIiwNCiAgICAgICBwbG90ID0gZGJvX3AxLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQoNCmdnc2F2ZSgiZGJvX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IGRib19wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJkYm9fcDMucG5nIiwNCiAgICAgICBwbG90ID0gZGJvX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImRib18zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShkYm9fcDEsIGRib19wMiwgZGJvX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIEbDs3Nmb3JvIHRvdGFsDQoNCmBgYHtyIEdyw6FmaWNvIEbDs3Nmb3JvIHRvdGFsIHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihwdG90X3AxPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwJT4lIA0KICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIGBGw7NzZm9ybyB0b3RhbGApKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLjE1LA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MC4xLA0KICAgICAgICAgICAgeW1heD0wLjE1LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9MC4xLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiRsOzc2Zvcm8gdG90YWwgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMywwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRgRsOzc2Zvcm8gdG90YWxgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRgRsOzc2Zvcm8gdG90YWxgKSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIHRoZW1lX2dyYWZzKCkNCikNCg0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIEbDs3Nmb3JvIHRvdGFsIHBlcmlvZG8yLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihwdG90X3AyIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAlPiUgDQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICBgRsOzc2Zvcm8gdG90YWxgKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MC4xNSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAuMSwNCiAgICAgICAgICAgIHltYXg9MC4xNSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTAuMSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIkbDs3Nmb3JvIHRvdGFsIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Im1nL0wiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDMsMC4wMykpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkYEbDs3Nmb3JvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkYEbDs3Nmb3JvIHRvdGFsYCksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiB0aGVtZV9ncmFmcygpDQopDQoNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBGw7NzZm9ybyB0b3RhbCBwZXJpb2RvMywgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoocHRvdF9wMyA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgYEbDs3Nmb3JvIHRvdGFsYCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAuMTUsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLjEsDQogICAgICAgICAgICB5bWF4PTAuMTUsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0wLjEsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJGw7NzZm9ybyB0b3RhbCBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJtZy9MIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAzLDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJGBGw7NzZm9ybyB0b3RhbGAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJGBGw7NzZm9ybyB0b3RhbGApLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIikrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgIjg3NDA1NTAwIiwgIjg3NDA2OTAwIiwgIjg3NDA5OTAwIikpKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQoNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBQdG90IDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKHB0b3RfcDEsIHB0b3RfcDIsIHB0b3RfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIEbDs3Nmb3JvIHRvdGFsfQ0KKHN1bV9wdG90X3AxIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgIHNlbGVjdChDT0RJR08sIGBGw7NzZm9ybyB0b3RhbGAsIEFOT19DT0xFVEEpICU+JSANCiAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpICU+JSANCiAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgc3VtbWFyaXplKA0KICAgICBtaW4gPSANCiAgICAgICBtaW4oYEbDs3Nmb3JvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShgRsOzc2Zvcm8gdG90YWxgLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oYEbDs3Nmb3JvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oYEbDs3Nmb3JvIHRvdGFsYCwgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKGBGw7NzZm9ybyB0b3RhbGAsIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChgRsOzc2Zvcm8gdG90YWxgLCBuYS5ybSA9IFRSVUUpKSkNCg0KKHN1bV9wdG90X3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBgRsOzc2Zvcm8gdG90YWxgLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpICU+JSANCiAgICBncm91cF9ieShDT0RJR08pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKGBGw7NzZm9ybyB0b3RhbGAsIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShgRsOzc2Zvcm8gdG90YWxgLCAwLjI1LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihgRsOzc2Zvcm8gdG90YWxgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKGBGw7NzZm9ybyB0b3RhbGAsIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGBGw7NzZm9ybyB0b3RhbGAsIDAuNzUsIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGBGw7NzZm9ybyB0b3RhbGAsIG5hLnJtID0gVFJVRSkpKQ0KDQooc3VtX3B0b3RfcDMgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIGBGw7NzZm9ybyB0b3RhbGAsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oYEbDs3Nmb3JvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKGBGw7NzZm9ybyB0b3RhbGAsIDAuMjUsIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKGBGw7NzZm9ybyB0b3RhbGAsIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oYEbDs3Nmb3JvIHRvdGFsYCwgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoYEbDs3Nmb3JvIHRvdGFsYCwgMC43NSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoYEbDs3Nmb3JvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSkpDQoNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBQdG90fQ0KZ2dzYXZlKCJwdG90X3AxLnBuZyIsDQogICAgICAgcGxvdCA9IHB0b3RfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgicHRvdF9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBwdG90X3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInB0b3RfcDMucG5nIiwNCiAgICAgICBwbG90ID0gcHRvdF9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJwdG90XzNwZXJpb2Rvcy5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZ3JpZC5hcnJhbmdlKHB0b3RfcDEsIHB0b3RfcDIsIHB0b3RfcDMsIG5jb2wgPSAzKSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQojIyMgRXNjaGVyaWNoaWEgY29saQ0KDQpgYGB7ciBHcsOhZmljbyBFY29saSBwZXJpb2RvMSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooZWNvbGlfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgYEVzY2hlcmljaGlhIGNvbGlgKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MzIwMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNhYzUwNzkiKSsgIz5waW9yIGNsYXNzZQ0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTgwMCwNCiAgICAgICAgICAgIHltYXg9MzIwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTE2MCwNCiAgICAgICAgICAgIHltYXg9ODAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9MTYwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiRXNjaGVyaWNoaWEgY29saSBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJOTVAvMTAwbUwiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDksDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJGBFc2NoZXJpY2hpYSBjb2xpYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkYEVzY2hlcmljaGlhIGNvbGlgLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIEVjb2xpIHBlcmlvZG8yLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihlY29saV9wMiA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgICBgRXNjaGVyaWNoaWEgY29saWApKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zMjAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49ODAwLA0KICAgICAgICAgICAgeW1heD0zMjAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTYwLA0KICAgICAgICAgICAgeW1heD04MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0xNjAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJFc2NoZXJpY2hpYSBjb2xpIG5vIHBlcsOtb2RvIDIwMDAtMjAxMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9Ik5NUC8xMDBtTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkYEVzY2hlcmljaGlhIGNvbGlgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRgRXNjaGVyaWNoaWEgY29saWAsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgIjg3NDA1NTAwIiwgIjg3NDA2OTAwIiwgIjg3NDA5OTAwIikpKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gRWNvbGkgcGVyaW9kbzMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGVjb2xpX3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgIGBFc2NoZXJpY2hpYSBjb2xpYCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTMyMDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj04MDAsDQogICAgICAgICAgICB5bWF4PTMyMDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xNjAsDQogICAgICAgICAgICB5bWF4PTgwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjNzBjMThjIikrICNjbGFzc2UgMg0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTE2MCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIkVzY2hlcmljaGlhIGNvbGkgbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iTk1QLzEwMG1MIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjAxKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA5LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRgRXNjaGVyaWNoaWEgY29saWAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocGxhbl93aWRlXzE5OTAyMDIwJGBFc2NoZXJpY2hpYSBjb2xpYCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBlY29saSAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZShlY29saV9wMSwgZWNvbGlfcDIsIGVjb2xpX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBFY29saX0NCihzdW1fZWNvbGlfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KENPRElHTywgYEVzY2hlcmljaGlhIGNvbGlgLCBBTk9fQ09MRVRBKSAlPiUgDQogICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSAlPiUgDQogICBncm91cF9ieShDT0RJR08pICU+JSANCiAgIHN1bW1hcml6ZSgNCiAgICAgbWluID0gDQogICAgICAgbWluKGBFc2NoZXJpY2hpYSBjb2xpYCwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUoYEVzY2hlcmljaGlhIGNvbGlgLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oYEVzY2hlcmljaGlhIGNvbGlgLCANCiAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVhbiA9IA0KICAgICAgIG1lYW4oYEVzY2hlcmljaGlhIGNvbGlgLCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShgRXNjaGVyaWNoaWEgY29saWAsIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChgRXNjaGVyaWNoaWEgY29saWAsIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Vjb2xpX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBgRXNjaGVyaWNoaWEgY29saWAsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oYEVzY2hlcmljaGlhIGNvbGlgLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShgRXNjaGVyaWNoaWEgY29saWAsIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihgRXNjaGVyaWNoaWEgY29saWAsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihgRXNjaGVyaWNoaWEgY29saWAsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGBFc2NoZXJpY2hpYSBjb2xpYCwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGBFc2NoZXJpY2hpYSBjb2xpYCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2Vjb2xpX3AzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBgRXNjaGVyaWNoaWEgY29saWAsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oYEVzY2hlcmljaGlhIGNvbGlgLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShgRXNjaGVyaWNoaWEgY29saWAsIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihgRXNjaGVyaWNoaWEgY29saWAsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihgRXNjaGVyaWNoaWEgY29saWAsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGBFc2NoZXJpY2hpYSBjb2xpYCwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KGBFc2NoZXJpY2hpYSBjb2xpYCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIGVjb2xpfQ0KZ2dzYXZlKCJlY29saV9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBlY29saV9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJlY29saV9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBlY29saV9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJlY29saV9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBlY29saV9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJlY29saV8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShlY29saV9wMSwgZWNvbGlfcDIsIGVjb2xpX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIE5pdHJvZ8OqbmlvIGFtb25pYWNhbA0KDQpgYGB7ciBHcsOhZmljbyBOaXRyb2fDqm5pbyB0b3RhbCBwZXJpb2RvMSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoobmFtb25fcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgYE5pdHJvZ8OqbmlvIHRvdGFsYCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEzLjMsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zLjcsDQogICAgICAgICAgICB5bWF4PTEzLjMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0zLjcsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJOaXRyb2fDqm5pbyBhbW9uaWFjYWwgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkYE5pdHJvZ8OqbmlvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkYE5pdHJvZ8OqbmlvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IC4wMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBOaXRyb2fDqm5pbyB0b3RhbCBwZXJpb2RvMiwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoobmFtb25fcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgYE5pdHJvZ8OqbmlvIHRvdGFsYCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEzLjMsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zLjcsDQogICAgICAgICAgICB5bWF4PTEzLjMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0zLjcsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJOaXRyb2fDqm5pbyBhbW9uaWFjYWwgbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkYE5pdHJvZ8OqbmlvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkYE5pdHJvZ8OqbmlvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IC4wMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBOaXRyb2fDqm5pbyB0b3RhbCBwZXJpb2RvMywgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoobmFtb25fcDMgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpLA0KICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgYE5pdHJvZ8OqbmlvIHRvdGFsYCkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTEzLjMsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zLjcsDQogICAgICAgICAgICB5bWF4PTEzLjMsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0wLA0KICAgICAgICAgICAgeW1heD0zLjcsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJOaXRyb2fDqm5pbyBhbW9uaWFjYWwgbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0ibWcvTCIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wNSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOSwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKG1pbihwbGFuX3dpZGVfMTk5MDIwMjAkYE5pdHJvZ8OqbmlvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkYE5pdHJvZ8OqbmlvIHRvdGFsYCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IC4wMDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBOYW1vbiAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZShuYW1vbl9wMSwgbmFtb25fcDIsIG5hbW9uX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBOaXRyb2fDqm5pbyB0b3RhbH0NCihzdW1fbmFtb25fcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KENPRElHTywgYE5pdHJvZ8OqbmlvIHRvdGFsYCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihgTml0cm9nw6puaW8gdG90YWxgLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShgTml0cm9nw6puaW8gdG90YWxgLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oYE5pdHJvZ8OqbmlvIHRvdGFsYCwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKGBOaXRyb2fDqm5pbyB0b3RhbGAsIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKGBOaXRyb2fDqm5pbyB0b3RhbGAsIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChgTml0cm9nw6puaW8gdG90YWxgLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9uYW1vbl9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgYE5pdHJvZ8OqbmlvIHRvdGFsYCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihgTml0cm9nw6puaW8gdG90YWxgLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShgTml0cm9nw6puaW8gdG90YWxgLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oYE5pdHJvZ8OqbmlvIHRvdGFsYCwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKGBOaXRyb2fDqm5pbyB0b3RhbGAsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGBOaXRyb2fDqm5pbyB0b3RhbGAsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChgTml0cm9nw6puaW8gdG90YWxgLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fbmFtb25fcDMgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIGBOaXRyb2fDqm5pbyB0b3RhbGAsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oYE5pdHJvZ8OqbmlvIHRvdGFsYCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoYE5pdHJvZ8OqbmlvIHRvdGFsYCwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKGBOaXRyb2fDqm5pbyB0b3RhbGAsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihgTml0cm9nw6puaW8gdG90YWxgLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShgTml0cm9nw6puaW8gdG90YWxgLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoYE5pdHJvZ8OqbmlvIHRvdGFsYCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIG5hbW9ufQ0KZ2dzYXZlKCJuYW1vbl9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBuYW1vbl9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJuYW1vbl9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBuYW1vbl9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJuYW1vbl9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBuYW1vbl9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJuYW1vbl8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShuYW1vbl9wMSwgbmFtb25fcDIsIG5hbW9uX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIFR1cmJpZGV6DQoNCmBgYHtyIEdyw6FmaWNvIFR1cmJpZGV6IHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCih0dXJiX3AxIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgVHVyYmlkZXopKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj00MCwNCiAgICAgICAgICAgIHltYXg9MTAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9NDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJUdXJiaWRleiBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJVTlQiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDUsIDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJFR1cmJpZGV6LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRUdXJiaWRleiwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFR1cmJpZGV6IHBlcmlvZG8yLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCih0dXJiX3AyIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgVHVyYmlkZXopKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xMDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj00MCwNCiAgICAgICAgICAgIHltYXg9MTAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MCwNCiAgICAgICAgICAgIHltYXg9NDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJUdXJiaWRleiBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSJVTlQiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDUsIDAuMDMpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhtaW4ocGxhbl93aWRlXzE5OTAyMDIwJFR1cmJpZGV6LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRUdXJiaWRleiwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBUdXJiaWRleiBwZXJpb2RvMywgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoodHVyYl9wMyA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgIFR1cmJpZGV6KSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NDAsDQogICAgICAgICAgICB5bWF4PTEwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZmNmN2FiIikrICNjbGFzc2UgMw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTAsDQogICAgICAgICAgICB5bWF4PTQwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiVHVyYmlkZXogbm8gcGVyw61vZG8gMjAxMC0yMDIwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iVU5UIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjA1LCAwLjAzKSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMobWluKHBsYW5fd2lkZV8xOTkwMjAyMCRUdXJiaWRleiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkVHVyYmlkZXosIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgIjg3NDA1NTAwIiwgIjg3NDA2OTAwIiwgIjg3NDA5OTAwIikpKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gdHVyYiAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZSh0dXJiX3AxLCB0dXJiX3AyLCB0dXJiX3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBUdXJiaWRlen0NCihzdW1fdHVyYl9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoQ09ESUdPLCBUdXJiaWRleiwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihUdXJiaWRleiwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUoVHVyYmlkZXosIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihUdXJiaWRleiwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKFR1cmJpZGV6LCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShUdXJiaWRleiwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KFR1cmJpZGV6LCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV90dXJiX3AyIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBUdXJiaWRleiwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihUdXJiaWRleiwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoVHVyYmlkZXosIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihUdXJiaWRleiwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKFR1cmJpZGV6LCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShUdXJiaWRleiwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KFR1cmJpZGV6LCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fdHVyYl9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgVHVyYmlkZXosIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oVHVyYmlkZXosIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKFR1cmJpZGV6LCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oVHVyYmlkZXosIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihUdXJiaWRleiwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoVHVyYmlkZXosIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChUdXJiaWRleiwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKSANCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyB0dXJifQ0KZ2dzYXZlKCJ0dXJiX3AxLnBuZyIsDQogICAgICAgcGxvdCA9IHR1cmJfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgidHVyYl9wMi5wbmciLA0KICAgICAgIHBsb3QgPSB0dXJiX3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoInR1cmJfcDMucG5nIiwNCiAgICAgICBwbG90ID0gdHVyYl9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJ0dXJiXzNwZXJpb2Rvcy5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZ3JpZC5hcnJhbmdlKHR1cmJfcDEsIHR1cmJfcDIsIHR1cmJfcDMsIG5jb2wgPSAzKSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCmBgYA0KDQojIyMgcEgNCg0KYGBge3IgR3LDoWZpY28gcEggcGVyaW9kbzEsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHBIX3AxIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIHBIKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9NiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTksDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTYsDQogICAgICAgICAgICB5bWF4PTksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJwSCBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg0LDExKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgIjg3NDA1NTAwIiwgIjg3NDA2OTAwIiwgIjg3NDA5OTAwIikpKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gcEggcGVyaW9kbzIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKHBIX3AyIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIHBIKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9NiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTksDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTYsDQogICAgICAgICAgICB5bWF4PTksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJwSCBubyBwZXLDrW9kbyAyMDAwLTIwMTAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg0LDExKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBwSCBwZXJpb2RvMywgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQoocEhfcDMgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgcEgpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD02LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NiwNCiAgICAgICAgICAgIHltYXg9OSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gInBIIG5vIHBlcsOtb2RvIDIwMTAtMjAyMCIsDQogICAgICAgIHg9IkVzdGHDp8OjbyIsDQogICAgICAgIHk9IiIpKw0KICAgZ2diZWVzd2FybTo6Z2VvbV9xdWFzaXJhbmRvbSgNCiAgICAgc2l6ZSA9IDEuMiwNCiAgICAgYWxwaGEgPSAuMjUsDQogICAgIHdpZHRoID0gLjA3LA0KICAgKSsNCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMC4wMSwgMC4wMSkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDQsMTEpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIHBIIDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKHBIX3AxLCBwSF9wMiwgcEhfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIHBIfQ0KKHN1bV9wSF9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoQ09ESUdPLCBwSCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihwSCwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUocEgsIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihwSCwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKHBILCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShwSCwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KHBILCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9wSF9wMiA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgcEgsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4ocEgsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHBILCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4ocEgsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihwSCwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUocEgsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChwSCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKSANCg0KKHN1bV9wSF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgcEgsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4ocEgsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKHBILCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4ocEgsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihwSCwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUocEgsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChwSCwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIHBIfQ0KZ2dzYXZlKCJwSF9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBwSF9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJwSF9wMi5wbmciLA0KICAgICAgIHBsb3QgPSBwSF9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJwSF9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBwSF9wMywNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJwSF8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShwSF9wMSwgcEhfcDIsIHBIX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIFPDs2xpZG9zIHRvdGFpcw0KDQpgYGB7ciBHcsOhZmljbyBTw7NsVG90IHBlcmlvZG8xLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihTb2xUb3RfcDEgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIiksDQogICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGBTw7NsaWRvcyB0b3RhaXNgKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJTw7NsaWRvcyB0b3RhaXMgbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkYFPDs2xpZG9zIHRvdGFpc2AsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBTw7NsVG90IHBlcmlvZG8yLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0NCihTb2xUb3RfcDIgPC0gZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIiksDQogICAgICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGBTw7NsaWRvcyB0b3RhaXNgKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJTw7NsaWRvcyB0b3RhaXMgbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkYFPDs2xpZG9zIHRvdGFpc2AsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwubWFyayA9ICIsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnLm1hcmsgPSAiICIpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWVfZ3JhZnMoKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIFPDs2xUb3QgcGVyaW9kbzMsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKFNvbFRvdF9wMyA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSwNCiAgICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgICAgYFPDs2xpZG9zIHRvdGFpc2ApKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MDAsDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPS1JbmYsDQogICAgICAgICAgICB5bWF4PTUwMCwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNykrDQogICBsYWJzKHRpdGxlID0gIlPDs2xpZG9zIHRvdGFpcyBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRgU8OzbGlkb3MgdG90YWlzYCwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgIjg3NDA1NTAwIiwgIjg3NDA2OTAwIiwgIjg3NDA5OTAwIikpKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogICB0aGVtZV9ncmFmcygpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gU8OzbFRvdCAzIHBlcmlvZG9zIGp1bnRvcywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmdyaWQuYXJyYW5nZShTb2xUb3RfcDEsIFNvbFRvdF9wMiwgU29sVG90X3AzLCBuY29sID0gMykNCmBgYA0KDQpgYGB7ciBTdW3DoXJpbyBTw7NsaWRvcyBUb3RhaXN9DQooc3VtX1NvbFRvdF9wMSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICBzZWxlY3QoQ09ESUdPLCBgU8OzbGlkb3MgdG90YWlzYCwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihgU8OzbGlkb3MgdG90YWlzYCwgDQogICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIHExID0gDQogICAgICAgcXVhbnRpbGUoYFPDs2xpZG9zIHRvdGFpc2AsIDAuMjUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lZGlhbiA9IA0KICAgICAgIG1lZGlhbihgU8OzbGlkb3MgdG90YWlzYCwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKGBTw7NsaWRvcyB0b3RhaXNgLCANCiAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgcTMgPSANCiAgICAgICBxdWFudGlsZShgU8OzbGlkb3MgdG90YWlzYCwgMC43NSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWF4ID0gDQogICAgICAgbWF4KGBTw7NsaWRvcyB0b3RhaXNgLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9Tb2xUb3RfcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIGBTw7NsaWRvcyB0b3RhaXNgLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAxMCIpICU+JSANCiAgICBncm91cF9ieShDT0RJR08pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKGBTw7NsaWRvcyB0b3RhaXNgLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShgU8OzbGlkb3MgdG90YWlzYCwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKGBTw7NsaWRvcyB0b3RhaXNgLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oYFPDs2xpZG9zIHRvdGFpc2AsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGBTw7NsaWRvcyB0b3RhaXNgLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoYFPDs2xpZG9zIHRvdGFpc2AsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9Tb2xUb3RfcDMgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIGBTw7NsaWRvcyB0b3RhaXNgLCBBTk9fQ09MRVRBKSAlPiUgDQogICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMTAiICYNCiAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpICU+JSANCiAgICBncm91cF9ieShDT0RJR08pICU+JSANCiAgICBzdW1tYXJpemUoDQogICAgICBtaW4gPSANCiAgICAgICAgbWluKGBTw7NsaWRvcyB0b3RhaXNgLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShgU8OzbGlkb3MgdG90YWlzYCwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKGBTw7NsaWRvcyB0b3RhaXNgLCANCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWFuID0gDQogICAgICAgIG1lYW4oYFPDs2xpZG9zIHRvdGFpc2AsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKGBTw7NsaWRvcyB0b3RhaXNgLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoYFPDs2xpZG9zIHRvdGFpc2AsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBTb2xUb3R9DQpnZ3NhdmUoIlNvbFRvdF9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBTb2xUb3RfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiU29sVG90X3AyLnBuZyIsDQogICAgICAgcGxvdCA9IFNvbFRvdF9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJTb2xUb3RfcDMucG5nIiwNCiAgICAgICBwbG90ID0gU29sVG90X3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoIlNvbFRvdF8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShTb2xUb3RfcDEsIFNvbFRvdF9wMiwgU29sVG90X3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMjIElRQQ0KDQpgYGB7ciBHcsOhZmljbyBJUUEgcGVyaW9kbzEsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCihpcWFfcDEgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIxOTkwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAwMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgSVFBLCBuYS5ybSA9IFRSVUUpKSsNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgICB5bWF4PTE5LA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTE5LA0KICAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgICBmaWxsPSIjZWI1NjYxIikrICNjbGFzc2UgNA0KICAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgICB5bWF4PTUxLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgIHltaW49NTEsDQogICAgICAgICAgICAgeW1heD03OSwNCiAgICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgICB5bWluPTc5LA0KICAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpLA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkrDQogICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgIHk9IiIpKw0KICAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA2LA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lX2dyYWZzKCkrDQogICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpDQopDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIHBlcmlvZG8yLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQooaXFhX3AyIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQogICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEEgPiAiMjAwMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOT19DT0xFVEEgPD0gIjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgIElRQSwgbmEucm0gPSBUUlVFKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9MTksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2FjNTA3OSIpKyAjPnBpb3IgY2xhc3NlDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MTksDQogICAgICAgICAgICB5bWF4PTM2LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49MzYsDQogICAgICAgICAgICB5bWF4PTUxLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNmY2Y3YWIiKSsgI2NsYXNzZSAzDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTEsDQogICAgICAgICAgICB5bWF4PTc5LA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM3MGMxOGMiKSsgI2NsYXNzZSAyDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NzksDQogICAgICAgICAgICB5bWF4PUluZiwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KICAgc3RhdF9ib3hwbG90KGdlb20gPSAnZXJyb3JiYXInLA0KICAgICAgICAgICAgICAgIHdpZHRoPTAuMywNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSksDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcsDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSsNCiAgIGxhYnModGl0bGUgPSAiVmFyaWHDp8OjbyBkbyBJUUEgbm8gcGVyw61vZG8gMjAwMC0yMDEwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLDApKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDYsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMSwxMDEpKSsNCiAgIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiODczOTg1MDAiLCAiODczOTg5ODAiLCAiODczOTg5MDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIHRoZW1lX2dyYWZzKCkrDQogICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkNCiAgICkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBJUUEgcGVyaW9kbzMsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCihpcWFfcDMgPC1nZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQSA+ICIyMDEwIiAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQSA8PSAiMjAyMCIpLA0KICAgICAgICAgICAgICAgICBhZXMoQ09ESUdPLA0KICAgICAgICAgICAgICAgICAgICAgSVFBLCBuYS5ybSA9IFRSVUUpKSsNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD0xOSwNCiAgICAgICAgICAgIGFscGhhPTEsDQogICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0xOSwNCiAgICAgICAgICAgIHltYXg9MzYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0zNiwNCiAgICAgICAgICAgIHltYXg9NTEsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj01MSwNCiAgICAgICAgICAgIHltYXg9NzksDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj03OSwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSwNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgZ2VvbV9ib3hwbG90KGZpbGw9JyNGOEY4RkYnLA0KICAgICAgICAgICAgICAgIGNvbG9yPSJibGFjayIsDQogICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQogICAgICAgICAgICAgICAgd2lkdGg9IDAuNywNCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKw0KICAgbGFicyh0aXRsZSA9ICJWYXJpYcOnw6NvIGRvIElRQSBubyBwZXLDrW9kbyAyMDEwLTIwMjAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KICAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gNiwNCiAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0xLDEwMSkpKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3Mzk4OTUwIiwgIjg3NDA1NTAwIiwgIjg3NDA2OTAwIiwgIjg3NDA5OTAwIikpKw0KICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgIHNlPUZBTFNFLCAjc2UgZGVpeGFyIFRSVUUgZ2VyYSBvIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlIDk1JQ0KICAgICAgICAgICAgICAgYWVzKGdyb3VwPTEpLA0KICAgICAgICAgICAgICAgYWxwaGE9LjUsDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUsDQogICAgICAgICAgICAgICBzaXplID0gMSkrDQogdGhlbWVfZ3JhZnMoKSsNCiAgIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkNCiApDQpgYGANCg0KYGBge3IgR3LDoWZpY28gSVFBIDMgcGVyaW9kb3MganVudG9zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ3JpZC5hcnJhbmdlKGlxYV9wMSwgaXFhX3AyLCBpcWFfcDMsIG5jb2wgPSAzKQ0KYGBgDQoNCmBgYHtyIFN1bcOhcmlvIElRQX0NCihzdW1fSVFBX3AxIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgIHNlbGVjdChDT0RJR08sIElRQSwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihJUUEsIA0KICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBxMSA9IA0KICAgICAgIHF1YW50aWxlKElRQSwgMC4yNSwgDQogICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgbWVkaWFuID0gDQogICAgICAgbWVkaWFuKElRQSwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKElRQSwgDQogICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgIHEzID0gDQogICAgICAgcXVhbnRpbGUoSVFBLCAwLjc1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtYXggPSANCiAgICAgICBtYXgoSVFBLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9JUUFfcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIElRQSwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDAwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihJUUEsIA0KICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIHExID0gDQogICAgICAgIHF1YW50aWxlKElRQSwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKElRQSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKElRQSwgDQogICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICAgcTMgPSANCiAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoSVFBLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSkpDQopDQoNCihzdW1fSVFBX3AzIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiAgICBzZWxlY3QoQ09ESUdPLCBJUUEsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDIwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oSVFBLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShJUUEsIDAuMjUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVkaWFuID0gDQogICAgICAgIG1lZGlhbihJUUEsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihJUUEsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKElRQSwgMC43NSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtYXggPSANCiAgICAgICAgbWF4KElRQSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbiA9IA0KICAgICAgICBsZW5ndGgoSVFBKSkNCikNCg0KcGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgc2VsZWN0KENPRElHTywgSVFBKSAlPiUgDQogIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICBzdW1tYXJpemUoDQogICAgbWluID0gDQogICAgICBtaW4oSVFBLCANCiAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgIHExID0gDQogICAgICBxdWFudGlsZShJUUEsIDAuMjUsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICBtZWRpYW4gPSANCiAgICAgIG1lZGlhbihJUUEsIA0KICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgbWVhbiA9IA0KICAgICAgbWVhbihJUUEsIA0KICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgcTMgPSANCiAgICAgIHF1YW50aWxlKElRQSwgMC43NSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgIG1heCA9IA0KICAgICAgbWF4KElRQSwgDQogICAgICAgICAgbmEucm0gPSBUUlVFKSkNCmBgYA0KDQpgYGB7ciBTYWx2YW5kbyBpcWF9DQpnZ3NhdmUoImlxYV9wMS5wbmciLA0KICAgICAgIHBsb3QgPSBpcWFfcDEsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiaXFhX3AyLnBuZyIsDQogICAgICAgcGxvdCA9IGlxYV9wMiwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJpcWFfcDMucG5nIiwNCiAgICAgICBwbG90ID0gaXFhX3AzLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImlxYV8zcGVyaW9kb3MucG5nIiwNCiAgICAgICB1bml0cyA9IGMoInB4IiksDQogICAgICAgd2lkdGggPSA0NTAwLA0KICAgICAgIGhlaWdodCA9IDI5OTMsDQogICAgICAgcGxvdCA9IGdyaWQuYXJyYW5nZShpcWFfcDEsIGlxYV9wMiwgaXFhX3AzLCBuY29sID0gMyksDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQpgYGANCg0KIyMgVGVzdGFuZG8gY29pc2FzDQoNCmBgYHtyIFRlc3RhbmRvIGNvaXNhcywgaW5jbHVkZSA9IEZBTFNFfQ0KIyBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgICBzZWxlY3QoQ09ESUdPLCBgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gLCBBTk9fQ09MRVRBKSAlPiUgDQojICAgIGdncGxvdChhZXMoQU5PX0NPTEVUQSwgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCwgDQojICAgICAgIGNvbCA9IENPRElHTykpKw0KIyAgICBnZW9tX2xpbmUoKSsNCiMgICAgZmFjZXRfd3JhcCh+IENPRElHTywgbmNvbCA9IDcpDQoNCiMgZGYxMTEgPC0gZGF0YS5mcmFtZSh4ID0gYygxOjEwMCkpDQojIGdsaW1wc2UoZGYxMTEpDQojIGRmMTExJHkgPC0gMiArIDMgKiBkZjExMSR4ICsgcm5vcm0oMTAwLCBzZCA9IDQwKQ0KIyANCiMgbG1fZXFuIDwtIGZ1bmN0aW9uKGRmMTExKXsNCiMgICAgIG0gPC0gbG0oeSB+IHgsIGRmMTExKTsNCiMgICAgIGVxIDwtIHN1YnN0aXR1dGUoeSA9PSBhICsgYiAlLiUgeCoiLCJ+fnJeMn4iPSJ+cjIsDQojICAgICAgICAgIGxpc3QoYSA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsxXSksIGRpZ2l0cyA9IDIpLA0KIyAgICAgICAgICAgICAgIGIgPSBmb3JtYXQodW5uYW1lKGNvZWYobSlbMl0pLCBkaWdpdHMgPSAyKSwNCiMgICAgICAgICAgICAgIHIyID0gZm9ybWF0KHN1bW1hcnkobSkkci5zcXVhcmVkLCBkaWdpdHMgPSAzKSkpDQojICAgICBhcy5jaGFyYWN0ZXIoYXMuZXhwcmVzc2lvbihlcSkpOw0KIyB9IA0KIyBwMiA8LSBwMTExICsNCiMgICBnZW9tX3RleHQoeCA9IDI1LCB5ID0gMzAwLA0KIyAgICAgICAgICAgICBsYWJlbCA9IGxtX2VxbihkZjExMSksDQojICAgICAgICAgICAgIHBhcnNlID0gVFJVRSkNCiMgcDINCiMgDQojIA0KIyBsbV9lcWMgPC0gZnVuY3Rpb24ocGxhbl93aWRlXzE5OTAyMDIwKXsNCiMgICAgbSA8LSBsbShgT3hpZ8OqbmlvIGRpc3NvbHZpZG9gIH4gQ09ESUdPLCBwbGFuX3dpZGVfMTk5MDIwMjApOw0KIyAgICBlcSA8LSBzdWJzdGl0dXRlKHkgPT0gYSArIGIgJS4lIHgqIiwifn5yXjJ+Ij0ifnIyLA0KIyAgICAgICAgICAgICAgICAgICAgIGxpc3QoYSA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsxXSksIGRpZ2l0cyA9IDIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGZvcm1hdCh1bm5hbWUoY29lZihtKVsyXSksIGRpZ2l0cyA9IDIpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSBmb3JtYXQoc3VtbWFyeShtKSRyLnNxdWFyZWQsIGRpZ2l0cyA9IDMpKSkNCiMgICAgYXMuY2hhcmFjdGVyKGFzLmV4cHJlc3Npb24oZXEpKTsNCiMgfQ0KIyANCiMgKG9kX3AxIDwtZ2dwbG90KHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUNCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihBTk9fQ09MRVRBPiIxOTkwIiAmDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMDAiKSwNCiMgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQojICAgICAgICAgICAgICAgICAgICAgYE94aWfDqm5pbyBkaXNzb2x2aWRvYCkpKw0KIyAgICAgICBhbm5vdGF0ZSgicmVjdCIsDQojICAgICAgICAgICAgICAgIHhtaW49LUluZiwNCiMgICAgICAgICAgICAgICAgeG1heD1JbmYsDQojICAgICAgICAgICAgICAgIHltaW49LUluZiwNCiMgICAgICAgICAgICAgICAgeW1heD0yLA0KIyAgICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgICBmaWxsPSIjYWM1MDc5IikrICM+cGlvciBjbGFzc2UNCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTIsDQojICAgICAgICAgICAgICAgIHltYXg9NCwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTQsDQojICAgICAgICAgICAgICAgIHltYXg9NSwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iI2ZjZjdhYiIpKyAjY2xhc3NlIDMNCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTUsDQojICAgICAgICAgICAgICAgIHltYXg9NiwNCiMgICAgICAgICAgICAgICAgYWxwaGE9MSwNCiMgICAgICAgICAgICAgICAgZmlsbD0iIzcwYzE4YyIpKyAjY2xhc3NlIDINCiMgICAgICAgYW5ub3RhdGUoInJlY3QiLA0KIyAgICAgICAgICAgICAgICB4bWluPS1JbmYsDQojICAgICAgICAgICAgICAgIHhtYXg9SW5mLA0KIyAgICAgICAgICAgICAgICB5bWluPTYsDQojICAgICAgICAgICAgICAgIHltYXg9SW5mLA0KIyAgICAgICAgICAgICAgICBhbHBoYT0xLA0KIyAgICAgICAgICAgICAgICBmaWxsPSIjOGRjZGViIikrICNjbGFzc2UgMQ0KIyAgICAgICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQojICAgICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQojICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC42NSkpKw0KIyAgICAgICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQojICAgICAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KIyAgICAgICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCAjc2UgZGVpeGFyIE5BIGZpY2Egc8OzIG8gaml0dGVyLCBzZSBuw6NvLCBkZWl4YSAxDQojICAgICAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiMgICAgICAgbGFicyh0aXRsZSA9ICJPeGlnw6puaW8gRGlzc29sdmlkbyBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KIyAgICAgICAgICAgIHg9IkVzdGHDp8OjbyIsDQojICAgICAgICAgICAgeT0ibWcvTCIpKw0KIyAgICAgICAjIGdlb21faml0dGVyKHdpZHRoID0gLjA1LA0KIyAgICAgICAjICAgICAgICAgICAgIGFscGhhPS4yLA0KIyAgICAgICAjICAgICAgICAgICAgIHNpemU9MS41LA0KIyAgICAgICAjICAgICAgICAgICAgIGNvbG9yPSJibGFjayIpKw0KIyAgICAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsMCkpLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSAxMSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoLTEsMjEpKSsNCiMgICAgICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiMgICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwNCiMgICAgICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQojICAgICAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiMgICAgICAgICAgICAgICAgICAgYWxwaGE9LjUsDQojICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiMgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KIyAgICAgICAjIGFubm90YXRlKGdlb21fdGV4dChhZXMoeCA9ICI4NzQwNTUwMCIsIHkgPSAxNSksDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbG1fZXFjKHBsYW5fd2lkZV8xOTkwMjAyMCksDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gVFJVRSwNCiMgICAgICAgIyAgICAgICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBUUlVFLA0KIyAgICAgICAjICAgICAgICAgICAgICAgICAgICBjaGVja19vdmVybGFwID0gVFJVRSkpKw0KIyAgICAgICAjICBnZW9tX2xpbmUoDQojICAgICAgICMgICAgIGFlcyhjb2xvcj0icmVkIiksDQojICAgICAgICMgICAgIGFscGhhPS4wLA0KIyAgICAgICAjICkrDQojICAgICAgICMgc2NhbGVfY29sb3JfbWFudWFsKCJMZWdlbmRhIiwNCiMgICAgICAgIyAgICAgICAgICAgICAgICAgICAgZ3VpZGU9ImxlZ2VuZCIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkNsYXNzZSAxIj0iIzhkY2RlYiIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSAyIj0iIzcwYzE4YyIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSAzIj0iI2ZjZjdhYiIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsYXNzZSA0Ij0iI2ViNTY2MSIsDQojICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBpb3IgQ2xhc3NlIj0iI2FjNTA3OSIpKSsNCiMgICAgIyBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3QobGluZXR5cGU9YygxLDEsMSwxLDEpLA0KIyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsd2Q9YygyLDIsMiwyLDIpLA0KIyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZT1jKE5BLE5BLE5BLE5BLE5BKSwNCiMgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGE9MSkpKSsNCiMgICAgICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgICAgICB0aGVtZV9jbGFzc2ljKCkpDQoNCiMgbGlzdDExMTEgPC0gc2Vzc2lvbkluZm8oKQ0KIyBsaXN0MTExMSRsb2FkZWRPbmx5DQoNCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbWlzYyIpDQojIGxpYnJhcnkoZ2dwbWlzYykNCg0KIyBzdW1tYXJ5KGxtKHBsYW5fd2lkZV8xOTkwMjAyMCRDT0RJR09+cGxhbl93aWRlXzE5OTAyMDIwJERCTykpDQojIA0KIyANCiMgcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHk9bnVtYmVyLCB4PXBvZCkpICsNCiMgICBnZW9tX2JveHBsb3QoKQ0KIyBwcmludChwKQ0KDQojIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQoNCg0KIyBmaXQgPSBsbShwbGFuX3dpZGVfMTk5MDIwMjAkYE94aWfDqm5pbyBkaXNzb2x2aWRvYH4gcGxhbl93aWRlXzE5OTAyMDIwJENPRElHTykNCiMgc3VtbWFyeShmaXQpDQojIHN1bW1hcnkubG0oZml0KQ0KIyANCiMgcGxhbl93aWRlXzE5OTAyMDIwJElRQQ0KIyANCiMgcGxhbl93aWRlXzE5OTAyMDIwIDwtIHBsYW5fd2lkZV8xOTkwMjAyMCAlPiUgDQojICAgIG11dGF0ZShJUUEgPSBpZmVsc2UoSVFBID09IDAsIE5BLCBJUUEpKQ0KIyBwYWNtYW46OnBfbG9hZChlc3F1aXNzZSkNCmBgYA0KDQojIyMgQ29ycmVsYcOnw6NvDQoNCmBgYHtyIENvcnJlbGHDp8OjbywgdGltZV9pdCA9IFRSVUV9DQpwYXJhbWV0cm9zX0lRQSA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogIHNlbGVjdChDT0RJR08sDQogICAgICAgICBwSCwNCiAgICAgICAgIERCTywNCiAgICAgICAgIGBOaXRyb2fDqm5pbyBhbW9uaWFjYWxgLA0KICAgICAgICAgYE5pdHJvZ8OqbmlvIHRvdGFsYCwNCiAgICAgICAgIGBGw7NzZm9ybyB0b3RhbGAsDQogICAgICAgICBgVGVtcGVyYXR1cmEgw6FndWFgLA0KICAgICAgICAgVHVyYmlkZXosDQogICAgICAgICBgU8OzbGlkb3MgdG90YWlzYCwNCiAgICAgICAgIGBPeGlnw6puaW8gZGlzc29sdmlkb2AsDQogICAgICAgICBDb25kdXRpdmlkYWRlKQ0KDQp3cml0ZS5jc3YocGFyYW1ldHJvc19JUUEsDQogICAgICAgICAgIi4vcGFyYW1ldHJvc19JUUEuY3N2IiwNCiAgICAgICAgICByb3cubmFtZXMgPSBGQUxTRSkNCg0KcGFyYW1ldHJvc19JUUEgJT4lIA0KICBzZWxlY3QoLUNPRElHTykgJT4lIA0KICBnZ2NvcnIobWV0aG9kID0gImNvbXBsZXRlLm9icyIsDQogICAgICAgICAgICMgInBlYXJzb24iLA0KICAgICAgICAgICAjICJwYWlyd2lzZSIsDQogICAgICAgICBuYW1lID0gIkNvcnJlbGHDp8OjbyIsDQogICAgICAgICBsYWJlbCA9IFRSVUUsDQogICAgICAgICBsYWJlbF9hbHBoYSA9IFRSVUUsDQogICAgICAgICBkaWdpdHMgPSAzLA0KICAgICAgICAgbG93ID0gIiMzQjlBQjIiLA0KICAgICAgICAgbWlkID0gIiNFRUVFRUUiLA0KICAgICAgICAgaGlnaCA9ICIjRjIxQTAwIiwNCiAgICAgICAgICMgcGFsZXR0ZSA9ICJSZFlsQnUiLA0KICAgICAgICAgbGF5b3V0LmV4cCA9IDAsDQogICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibGVmdCIsDQogICAgICAgICBsYWJlbF9yb3VuZCA9IDMsDQogICAgICAgICApDQoNCiMgR3LDoWZpY28gZGFzIGNvcnJlbGHDp8O1ZXMgZW50cmUgdG9kb3Mgb3MgcGFyw6JtZXRyb3MgY29tIHNpZ25pZmljw6JuY2lhDQojIGNvcnJlbF9JUUEgPC0gcGFyYW1ldHJvc19JUUEgJT4lIA0KIyAgIHNlbGVjdCgtQ09ESUdPKSAlPiUgDQojICAgZ2dwYWlycyh0aXRsZSA9ICJDb3JyZWxhw6fDo28gZW50cmUgcGFyw6JtZXRyb3MgcXVlIGNvbXDDtWVtIG8gSVFBIiwNCiMgICAgICAgICAgIGF4aXNMYWJlbHMgPSAic2hvdyIpDQpgYGANCg0KIyMjIENvbmR1dGl2aWRhZGUgZWzDqXRyaWNhDQoNCmBgYHtyIEdyw6FmaWNvIGNvbmRfZWxldCBwZXJpb2RvMSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooY29uZF9lbGV0X3AxIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMTk5MCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAwMCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kdXRpdmlkYWRlKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJDb25kdXRpdmlkYWRlIGVsw6l0cmljYSBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRDb25kdXRpdmlkYWRlLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lKA0KICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KA0KICAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICBzaXplID0gMTkpLA0KICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoDQogICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgIHNpemUgPSAxNSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KA0KICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICBzaXplID0gMTcpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgNCiAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgc2l6ZSA9IDE3KSwNCiAgICkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBjb25kX2VsZXQgcGVyaW9kbzIsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQ0KKGNvbmRfZWxldF9wMiA8LSBnZ3Bsb3QocGxhbl93aWRlXzE5OTAyMDIwICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKEFOT19DT0xFVEE+IjIwMDAiICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMTAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFlcyhDT0RJR08sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZHV0aXZpZGFkZSkpKw0KICAgYW5ub3RhdGUoInJlY3QiLA0KICAgICAgICAgICAgeG1pbj0tSW5mLA0KICAgICAgICAgICAgeG1heD1JbmYsDQogICAgICAgICAgICB5bWluPTUwMCwNCiAgICAgICAgICAgIHltYXg9SW5mLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiNlYjU2NjEiKSsgI2NsYXNzZSA0DQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49LUluZiwNCiAgICAgICAgICAgIHltYXg9NTAwLA0KICAgICAgICAgICAgYWxwaGE9MSwNCiAgICAgICAgICAgIGZpbGw9IiM4ZGNkZWIiKSsgI2NsYXNzZSAxDQogICBzdGF0X2JveHBsb3QoZ2VvbSA9ICdlcnJvcmJhcicsDQogICAgICAgICAgICAgICAgd2lkdGg9MC4zLA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjY1KSkrDQogICBnZW9tX2JveHBsb3QoZmlsbD0nI0Y4RjhGRicsDQogICAgICAgICAgICAgICAgY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsICNzZSBkZWl4YXIgTkEgZmljYSBzw7MgbyBqaXR0ZXIsIHNlIG7Do28sIGRlaXhhIDENCiAgICAgICAgICAgICAgICB3aWR0aD0gMC43KSsNCiAgIGxhYnModGl0bGUgPSAiQ29uZHV0aXZpZGFkZSBlbMOpdHJpY2Egbm8gcGVyw61vZG8gMTk5MC0yMDAwIiwNCiAgICAgICAgeD0iRXN0YcOnw6NvIiwNCiAgICAgICAgeT0iIikrDQogICBnZ2JlZXN3YXJtOjpnZW9tX3F1YXNpcmFuZG9tKA0KICAgICBzaXplID0gMS4yLA0KICAgICBhbHBoYSA9IC4yNSwNCiAgICAgd2lkdGggPSAuMDcsDQogICApKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjAxLCAwLjA1KSksDQogICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSA4LA0KICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChwbGFuX3dpZGVfMTk5MDIwMjAkQ29uZHV0aXZpZGFkZSwgbmEucm0gPSBUUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbC5tYXJrID0gIiwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWcubWFyayA9ICIgIikpKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCI4NzM5ODUwMCIsICI4NzM5ODk4MCIsICI4NzM5ODkwMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4NzM5ODk1MCIsICI4NzQwNTUwMCIsICI4NzQwNjkwMCIsICI4NzQwOTkwMCIpKSsNCiAgIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsDQogICAgICAgICAgICAgICBzZT1GQUxTRSwgI3NlIGRlaXhhciBUUlVFIGdlcmEgbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSA5NSUNCiAgICAgICAgICAgICAgIGFlcyhncm91cD0xKSwNCiAgICAgICAgICAgICAgIGFscGhhPS41LA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFLA0KICAgICAgICAgICAgICAgc2l6ZSA9IDEpKw0KICAgdGhlbWUoDQogICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoDQogICAgICAgaGp1c3QgPSAwLjUsDQogICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgIHNpemUgPSAxOSksDQogICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dCgNCiAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgc2l6ZSA9IDE1KSwNCiAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoDQogICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgIHNpemUgPSAxNyksDQogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KA0KICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICBzaXplID0gMTcpLA0KICAgKQ0KKQ0KYGBgDQoNCmBgYHtyIEdyw6FmaWNvIGNvbmRfZWxldCBwZXJpb2RvMywgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9DQooY29uZF9lbGV0X3AzIDwtIGdncGxvdChwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAxMCIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk9fQ09MRVRBPD0iMjAyMCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYWVzKENPRElHTywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kdXRpdmlkYWRlKSkrDQogICBhbm5vdGF0ZSgicmVjdCIsDQogICAgICAgICAgICB4bWluPS1JbmYsDQogICAgICAgICAgICB4bWF4PUluZiwNCiAgICAgICAgICAgIHltaW49NTAwLA0KICAgICAgICAgICAgeW1heD1JbmYsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iI2ViNTY2MSIpKyAjY2xhc3NlIDQNCiAgIGFubm90YXRlKCJyZWN0IiwNCiAgICAgICAgICAgIHhtaW49LUluZiwNCiAgICAgICAgICAgIHhtYXg9SW5mLA0KICAgICAgICAgICAgeW1pbj0tSW5mLA0KICAgICAgICAgICAgeW1heD01MDAsDQogICAgICAgICAgICBhbHBoYT0xLA0KICAgICAgICAgICAgZmlsbD0iIzhkY2RlYiIpKyAjY2xhc3NlIDENCiAgIHN0YXRfYm94cGxvdChnZW9tID0gJ2Vycm9yYmFyJywNCiAgICAgICAgICAgICAgICB3aWR0aD0wLjMsDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNjUpKSsNCiAgIGdlb21fYm94cGxvdChmaWxsPScjRjhGOEZGJywNCiAgICAgICAgICAgICAgICBjb2xvcj0iYmxhY2siLA0KICAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgI3NlIGRlaXhhciBOQSBmaWNhIHPDsyBvIGppdHRlciwgc2UgbsOjbywgZGVpeGEgMQ0KICAgICAgICAgICAgICAgIHdpZHRoPSAwLjcpKw0KICAgbGFicyh0aXRsZSA9ICJDb25kdXRpdmlkYWRlIGVsw6l0cmljYSBubyBwZXLDrW9kbyAxOTkwLTIwMDAiLA0KICAgICAgICB4PSJFc3Rhw6fDo28iLA0KICAgICAgICB5PSIiKSsNCiAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oDQogICAgIHNpemUgPSAxLjIsDQogICAgIGFscGhhID0gLjI1LA0KICAgICB3aWR0aCA9IC4wNywNCiAgICkrDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAuMDEsIDAuMDUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBuLmJyZWFrcyA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KHBsYW5fd2lkZV8xOTkwMjAyMCRDb25kdXRpdmlkYWRlLCBuYS5ybSA9IFRSVUUpKSwNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLm1hcmsgPSAiLCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZy5tYXJrID0gIiAiKSkrDQogICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIjg3Mzk4NTAwIiwgIjg3Mzk4OTgwIiwgIjg3Mzk4OTAwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODczOTg5NTAiLCAiODc0MDU1MDAiLCAiODc0MDY5MDAiLCAiODc0MDk5MDAiKSkrDQogICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLA0KICAgICAgICAgICAgICAgc2U9RkFMU0UsICNzZSBkZWl4YXIgVFJVRSBnZXJhIG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgOTUlDQogICAgICAgICAgICAgICBhZXMoZ3JvdXA9MSksDQogICAgICAgICAgICAgICBhbHBoYT0uNSwNCiAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSwNCiAgICAgICAgICAgICAgIHNpemUgPSAxKSsNCiAgIHRoZW1lKA0KICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KA0KICAgICAgIGhqdXN0ID0gMC41LA0KICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICBzaXplID0gMTkpLA0KICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoDQogICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgIHNpemUgPSAxNSksDQogICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KA0KICAgICAgIGNvbG9yID0gImJsYWNrIiwNCiAgICAgICBzaXplID0gMTcpLA0KICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dCgNCiAgICAgICBjb2xvciA9ICJibGFjayIsDQogICAgICAgc2l6ZSA9IDE3KSwNCiAgICkNCikNCmBgYA0KDQpgYGB7ciBHcsOhZmljbyBjb25kX2VsZXQgMyBwZXJpb2RvcyBqdW50b3MsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpncmlkLmFycmFuZ2UoY29uZF9lbGV0X3AxLCBjb25kX2VsZXRfcDIsIGNvbmRfZWxldF9wMywgbmNvbCA9IDMpDQpgYGANCg0KYGBge3IgU3Vtw6FyaW8gY29uZF9lbGV0fQ0KKHN1bV9jb25kX2VsZXRfcDEgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgc2VsZWN0KENPRElHTywgQ29uZHV0aXZpZGFkZSwgQU5PX0NPTEVUQSkgJT4lIA0KICAgZmlsdGVyKEFOT19DT0xFVEE+IjE5OTAiICYNCiAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDAwIikgJT4lIA0KICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICBzdW1tYXJpemUoDQogICAgIG1pbiA9IA0KICAgICAgIG1pbihDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgcTEgPSANCiAgICAgICBxdWFudGlsZShDb25kdXRpdmlkYWRlLCAwLjI1LCANCiAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICBtZWRpYW4gPSANCiAgICAgICBtZWRpYW4oQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1lYW4gPSANCiAgICAgICBtZWFuKENvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KICAgICBxMyA9IA0KICAgICAgIHF1YW50aWxlKENvbmR1dGl2aWRhZGUsIDAuNzUsIA0KICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgIG1heCA9IA0KICAgICAgIG1heChDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgbmEucm0gPSBUUlVFKSkNCikNCg0KKHN1bV9jb25kX2VsZXRfcDIgPC0gcGxhbl93aWRlXzE5OTAyMDIwICU+JQ0KICAgIHNlbGVjdChDT0RJR08sIENvbmR1dGl2aWRhZGUsIEFOT19DT0xFVEEpICU+JSANCiAgICBmaWx0ZXIoQU5PX0NPTEVUQT4iMjAwMCIgJg0KICAgICAgICAgICAgIEFOT19DT0xFVEE8PSIyMDEwIikgJT4lIA0KICAgIGdyb3VwX2J5KENPRElHTykgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIG1pbiA9IA0KICAgICAgICBtaW4oQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgcTEgPSANCiAgICAgICAgcXVhbnRpbGUoQ29uZHV0aXZpZGFkZSwgMC4yNSwgDQogICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBtZWRpYW4gPSANCiAgICAgICAgbWVkaWFuKENvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lYW4gPSANCiAgICAgICAgbWVhbihDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgICBuYS5ybT0gVFJVRSksDQogICAgICBxMyA9IA0KICAgICAgICBxdWFudGlsZShDb25kdXRpdmlkYWRlLCAwLjc1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1heCA9IA0KICAgICAgICBtYXgoQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KKQ0KDQooc3VtX2NvbmRfZWxldF9wMyA8LSBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lDQogICAgc2VsZWN0KENPRElHTywgQ29uZHV0aXZpZGFkZSwgQU5PX0NPTEVUQSkgJT4lIA0KICAgIGZpbHRlcihBTk9fQ09MRVRBPiIyMDEwIiAmDQogICAgICAgICAgICAgQU5PX0NPTEVUQTw9IjIwMjAiKSAlPiUgDQogICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQogICAgc3VtbWFyaXplKA0KICAgICAgbWluID0gDQogICAgICAgIG1pbihDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBxMSA9IA0KICAgICAgICBxdWFudGlsZShDb25kdXRpdmlkYWRlLCAwLjI1LCANCiAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiAgICAgIG1lZGlhbiA9IA0KICAgICAgICBtZWRpYW4oQ29uZHV0aXZpZGFkZSwgDQogICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWVhbiA9IA0KICAgICAgICBtZWFuKENvbmR1dGl2aWRhZGUsIA0KICAgICAgICAgICAgIG5hLnJtPSBUUlVFKSwNCiAgICAgIHEzID0gDQogICAgICAgIHF1YW50aWxlKENvbmR1dGl2aWRhZGUsIDAuNzUsIA0KICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KICAgICAgbWF4ID0gDQogICAgICAgIG1heChDb25kdXRpdmlkYWRlLCANCiAgICAgICAgICAgIG5hLnJtID0gVFJVRSksDQogICAgICBuID0gDQogICAgICAgIGxlbmd0aChDb25kdXRpdmlkYWRlKSkNCikNCg0KIyBwbGFuX3dpZGVfMTk5MDIwMjAgJT4lIA0KIyAgICBzZWxlY3QoQ09ESUdPLCBJUUEpICU+JSANCiMgICAgZ3JvdXBfYnkoQ09ESUdPKSAlPiUgDQojICAgIHN1bW1hcml6ZSgNCiMgICAgICAgbWluID0gDQojICAgICAgICAgIG1pbihJUUEsIA0KIyAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgcTEgPSANCiMgICAgICAgICAgcXVhbnRpbGUoSVFBLCAwLjI1LCANCiMgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgbWVkaWFuID0gDQojICAgICAgICAgIG1lZGlhbihJUUEsIA0KIyAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgbWVhbiA9IA0KIyAgICAgICAgICBtZWFuKElRQSwgDQojICAgICAgICAgICAgICAgbmEucm09IFRSVUUpLA0KIyAgICAgICBxMyA9IA0KIyAgICAgICAgICBxdWFudGlsZShJUUEsIDAuNzUsIA0KIyAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpLA0KIyAgICAgICBtYXggPSANCiMgICAgICAgICAgbWF4KElRQSwgDQojICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCmBgYHtyIFNhbHZhbmRvIGNvbmRfZWxldH0NCmdnc2F2ZSgiY29uZF9lbGV0X3AxLnBuZyIsDQogICAgICAgcGxvdCA9IGNvbmRfZWxldF9wMSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KZ2dzYXZlKCJjb25kX2VsZXRfcDIucG5nIiwNCiAgICAgICBwbG90ID0gY29uZF9lbGV0X3AyLA0KICAgICAgIHBhdGggPSAiLi9ncmFmaWNvcyIsDQogICAgICAgZHBpID0gMzAwLA0KICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KDQpnZ3NhdmUoImNvbmRfZWxldF9wMy5wbmciLA0KICAgICAgIHBsb3QgPSBjb25kX2VsZXRfcDMsDQogICAgICAgcGF0aCA9ICIuL2dyYWZpY29zIiwNCiAgICAgICBkcGkgPSAzMDAsDQogICAgICAgdHlwZSA9ICJjYWlybyIpDQoNCmdnc2F2ZSgiY29uZF9lbGV0XzNwZXJpb2Rvcy5wbmciLA0KICAgICAgIHVuaXRzID0gYygicHgiKSwNCiAgICAgICB3aWR0aCA9IDQ1MDAsDQogICAgICAgaGVpZ2h0ID0gMjk5MywNCiAgICAgICBwbG90ID0gZ3JpZC5hcnJhbmdlKGNvbmRfZWxldF9wMSwgY29uZF9lbGV0X3AyLCBjb25kX2VsZXRfcDMsIG5jb2wgPSAzKSwNCiAgICAgICBwYXRoID0gIi4vZ3JhZmljb3MiLA0KICAgICAgIGRwaSA9IDMwMCwNCiAgICAgICB0eXBlID0gImNhaXJvIikNCg0KYGBgDQo=